Hướng dẫn can i use a string id in mongodb? - tôi có thể sử dụng id chuỗi trong mongodb không?

Tôi đang sử dụng Java/Morphia để đối phó với MongoDB. ObjectID mặc định không thuận tiện cho việc sử dụng từ lớp Java. Tôi muốn biến nó thành một loại chuỗi trong khi giữ quá trình tạo khóa sử dụng ObjectID, giả sử _id = new ObjectId.toString().

Tôi muốn biết nếu có bất kỳ tác dụng phụ nào làm theo cách này? Ví dụ, nó sẽ tác động đến hiệu suất cơ sở dữ liệu hoặc gây ra xung đột chính trong bất kỳ phương tiện nào? Nó sẽ ảnh hưởng đến môi trường Sharding ...

Hướng dẫn can i use a string id in mongodb? - tôi có thể sử dụng id chuỗi trong mongodb không?

Charles

50,5K13 Huy hiệu vàng103 Huy hiệu bạc141 Huy hiệu đồng13 gold badges103 silver badges141 bronze badges

hỏi ngày 18 tháng 6 năm 2012 lúc 20:20Jun 18, 2012 at 20:20

Gelin Luogelin LuoGelin Luo

13.7K27 Huy hiệu vàng82 Huy hiệu bạc133 Huy hiệu đồng27 gold badges82 silver badges133 bronze badges

4

Bạn có thể sử dụng bất kỳ loại giá trị nào cho trường _id (ngoại trừ mảng). Nếu bạn chọn không sử dụng ObjectID, bạn sẽ phải bằng cách nào đó đảm bảo tính duy nhất của các giá trị (việc đúc ObjectID thành chuỗi sẽ làm). Nếu bạn cố gắng chèn khóa trùng lặp, lỗi sẽ xảy ra và bạn sẽ phải đối phó với nó.

Tôi không chắc nó sẽ có tác dụng gì đối với cụm Sharded khi bạn cố gắng chèn hai tài liệu có cùng _ID vào các mảnh khác nhau. Tôi nghi ngờ rằng nó sẽ cho phép bạn chèn, nhưng điều này sẽ cắn bạn sau. (Tôi sẽ phải kiểm tra điều này).

Điều đó nói rằng, bạn không nên gặp rắc rối với _id = (new ObjectId).toString().

Đã trả lời ngày 18 tháng 6 năm 2012 lúc 20:24Jun 18, 2012 at 20:24

Sergio Tastilitysevsergio TilysevSergio Tulentsev

223K42 Huy hiệu vàng365 Huy hiệu bạc360 Huy hiệu đồng42 gold badges365 silver badges360 bronze badges

3

Tôi thực sự đã làm điều tương tự bởi vì tôi đã gặp một số vấn đề để chuyển đổi ObjectID thành JSON.

Sau đó tôi đã làm một cái gì đó như

@Id
private String id;
public String getId() {
    return id();
}
public void setId(String id) {
    this.id = id;
}

Và mọi thứ hoạt động tốt cho đến khi tôi quyết định cập nhật một tài liệu được chèn trước đó, khi tôi nhận được đối tượng bằng ID đã gửi nó đến trang qua JSON và nhận cùng một đối tượng được cập nhật bởi JSON Post và sau đó sử dụng chức năng lưu từ kho dữ liệu, thay vì Cập nhật dữ liệu trước đó, nó đã chèn một tài liệu mới thay vì cập nhật dữ liệu đã có.

Thậm chí tồi tệ nhất, tài liệu mới có cùng ID so với tên được chèn trước đó, điều mà tôi nghĩ là không thể.

Dù sao, tôi đã đặt đối tượng riêng tư như một ObjectID và chỉ để lại được đặt làm chuỗi và sau đó nó hoạt động như mong đợi, không chắc chắn điều đó có ích trong trường hợp của bạn.

@Id
private ObjectId id;
public String getId() {
    return id.toString();
}
public void setId(String id) {
    this.id = new ObjectId(id);
}

Đã trả lời ngày 19 tháng 1 năm 2014 lúc 17:34Jan 19, 2014 at 17:34

Có, bạn có thể sử dụng một chuỗi làm _id của bạn.

Tôi chỉ giới thiệu nó nếu bạn có một số giá trị (trong tài liệu) rằng tự nhiên là một khóa duy nhất tốt. Tôi đã sử dụng thiết kế này trong một bộ sưu tập trong đó có một thẻ địa lý chuỗi, có dạng "xxxxyyyy"; Trường duy nhất trên mỗi tài liệu này sẽ phải có trong tài liệu và tôi phải xây dựng một chỉ mục trên đó ... vậy tại sao không sử dụng nó làm chìa khóa? .

Tuy nhiên, từ giai điệu của câu hỏi của bạn ("ObjectIDs không thuận tiện lắm"), nếu lý do duy nhất bạn muốn sử dụng một chuỗi là bạn không muốn bị làm phiền khi tìm ra cách quản lý gọn gàng ObjectIDs ... Tôi ' D đề nghị đó là giá trị thời gian của bạn để có được cái đầu của bạn xung quanh họ. Tôi chắc rằng họ không gặp rắc rối ... một khi bạn đã tìm ra rắc rối của mình với họ.

Nếu không: các lựa chọn của bạn là gì? Bạn sẽ pha chế ID chuỗi mỗi khi bạn sử dụng MongoDB trong tương lai?

Eric Bishard

5.0917 Huy hiệu vàng50 Huy hiệu bạc74 Huy hiệu đồng7 gold badges50 silver badges74 bronze badges

Đã trả lời ngày 2 tháng 2 năm 2016 lúc 18:12Feb 2, 2016 at 18:12

Dan Hdan hDan H

13.4K6 Huy hiệu vàng37 Huy hiệu bạc32 Huy hiệu Đồng6 gold badges37 silver badges32 bronze badges

1

Tôi muốn nói thêm rằng không phải lúc nào cũng là một ý tưởng tốt để sử dụng BSON ObjectID được tạo tự động làm mã định danh duy nhất, nếu nó được chuyển cho ứng dụng: nó có khả năng được người dùng thao túng.

ObjectIDs dường như được tạo ra theo tuần tự, vì vậy nếu bạn không thực hiện các cơ chế ủy quyền cần thiết, người dùng độc hại chỉ có thể tăng giá trị mà anh ta có, để truy cập tài nguyên mà anh ta không nên truy cập.

CẬP NHẬT: Vì phiên bản 3.4+, các ObjectID không còn được tạo tăng dần. Vui lòng xem 3.2 Docs so với các tài liệu mới nhất Since version 3.4+ the ObjectIDs are no longer generated incrementally. Please see 3.2 docs vs the latest docs

Do đó, sử dụng định danh loại UUID sẽ cung cấp một lớp bảo mật thông qua. Tất nhiên, ủy quyền (là người dùng này được phép truy cập tài nguyên được yêu cầu) là điều bắt buộc, nhưng bạn nên biết về tính năng ObjectID đã nói ở trên.

Để có được điều tốt nhất của cả hai thế giới, hãy tạo UUID phù hợp với độ dài ObjectID của bạn (12 hoặc 24 ký tự) và sử dụng nó để tạo _ID của bạn thuộc loại ObjectID của riêng bạn.

Đã trả lời ngày 31 tháng 10 năm 2016 lúc 13:10Oct 31, 2016 at 13:10

Tonysepiatonysepiatonysepia

3.1463 huy hiệu vàng25 Huy hiệu bạc44 Huy hiệu đồng3 gold badges25 silver badges44 bronze badges

6

Bạn cũng có thể sử dụng một chuỗi như một ID từ Java. Dưới đây là một phương thức ví dụ và thử nghiệm đơn vị tương ứng chèn một đối tượng với ID chuỗi trong bộ sưu tập MongoDB:

public Document insert(String json, String collectionName) {
    MongoCollection<Document> collection = database.getCollection(collectionName);
    BasicDBObject document = BasicDBObject.parse(json);
    Document doc = new Document(document);
    collection.insertOne(doc);
    return doc;
}

@Test
void whenInsert_ShouldInsertOne() {
    final String uuid = UUID.randomUUID().toString();
    final String collection = "test_collection";
    final Document doc = app.insert(String.format("{\"_id\":\"%s\", \"name\": \"test\"}", 
        uuid), collection);
    assertThat(doc).isNotNull();
    final String json = app.getById(uuid, collection);
    assertThat(json).contains(String.format("\"_id\": \"%s\"", uuid));
}

Đã trả lời ngày 20 tháng 7 năm 2020 lúc 17:36Jul 20, 2020 at 17:36

gil.fernandesgil.fernandesgil.fernandes

12.1k5 Huy hiệu vàng56 Huy hiệu bạc72 Huy hiệu đồng5 gold badges56 silver badges72 bronze badges

Kiểu dữ liệu của ID trong MongoDB là gì?

MongoDB cung cấp một mã định danh duy nhất tự động cho trường _ID dưới dạng kiểu dữ liệu ObjectID.Đối với những người quen thuộc với các tài liệu MongoDB mà bạn có thể bắt gặp kiểu dữ liệu ObjectID trong trường _ID.ObjectId data type. For those that are familiar with MongoDB Documents you've likely come across the ObjectId data type in the _id field.

_Id có phải là một chuỗi không?

Điều này sẽ ném một lỗi trình biên dịch, vì ID là loại chuỗi, thay vì ObjectID.id is of type string, rather than ObjectId .

MongoDB có ID không?

Trường MongoDB _ID là nền tảng cho mọi bộ sưu tập trong MongoDB và theo mặc định, nó có một số thuộc tính hữu ích mà người dùng có thể tận dụng khi quen thuộc với cách tạo _id., and, by default, it has some useful properties users can take advantage of when familiar with how _id is generated.

Tôi có nên sử dụng ID MongoDB không?

Mỗi tài liệu trong bộ sưu tập đều có một trường _id _id được sử dụng để xác định duy nhất tài liệu trong một bộ sưu tập cụ thể, nó hoạt động như là khóa chính cho các tài liệu trong bộ sưu tập.Trường _id có thể được sử dụng ở bất kỳ định dạng nào và định dạng mặc định là ObjectID của tài liệu.. “_id” field can be used in any format and the default format is ObjectId of the document.