Nhận ID của tài liệu được chèn lần cuối trong trình điều khiển mongoDB w / Java


104

Có cách nào dễ dàng để lấy ID (ObjectID) của tài liệu được chèn cuối cùng của phiên bản mongoDB bằng trình điều khiển Java không?

Câu trả lời:


192

Tôi chỉ nhận ra rằng bạn có thể làm điều này:

BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );

13

Để tránh truyền từ Objectđến ObjectId, cho trước a com.mongodb.client.MongoCollection collectionvà a org.bson.Document doc, bạn có thể làm như sau:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");

Tôi giả sử điều này có thể xảy ra trong trình điều khiển java 3.x?
Jontia

12

Nó an toàn để làm

doc.set("_id", new ObjectId())

nếu bạn nhìn vào mã trình điều khiển

if ( ensureID && id == null ){
    id = ObjectId.get();
    jo.put( "_id" , id );       
}

public static ObjectId get(){
    return new ObjectId();
}

bạn có ý định nói it's save to dohay it's safe to dokhông?
pd40,

1
Vì một số lý do, trong MongoDB 2.2.2 (trái ngược với trước đó khi tôi sử dụng 2.2.0) và với trình điều khiển Java 2.10.1, mã trong câu trả lời không hoạt động; sau khi tôi up đối tượng vào tài liệu, tôi dường như không thể nhận được _id của nó, mặc dù MongoDB rõ ràng là tự động tạo ObjectId. Tuy nhiên, giải pháp tạo ObjectId theo cách thủ công của bạn vẫn hoạt động, và cảm ơn vì tùy chọn này!
Apophenia Overload

<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("doc.id trước:" + doc.get ("_ id")); new Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id sau:" + doc.get ("_ id")); </ code> Mã công việc này tốt cho tôi, thử nghiệm trên phiên bản mới 2.2.2 Mongo, tài xế 2.10.1
Zlob

7

Tôi không biết về trình điều khiển Java nhưng đối với hậu thế, lệnh getLastError có thể được chạy để lấy _id của một lần ghi, thậm chí là một upsert (kể từ 1.5.4)


4

Sau khi tài liệu được chèn vào bộ sưu tập MongoDB, việc chèn thành công sẽ cập nhật các trường bắt buộc (viz. _Id). Bạn có thể truy vấn đối tượng được chèn cho _id.


0

Trong MongoTemplate.class có một phương thức

protected <T> void doInsert(String collectionName, T objectToSave, MongoWriter<T> writer) {

    assertUpdateableIdIfNotSet(objectToSave);

    initializeVersionProperty(objectToSave);

    maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));

    DBObject dbDoc = toDbObject(objectToSave, writer);

    maybeEmitEvent(new BeforeSaveEvent<T>(objectToSave, dbDoc, collectionName));
    Object id = insertDBObject(collectionName, dbDoc, objectToSave.getClass());

    populateIdIfNecessary(objectToSave, id);
    maybeEmitEvent(new AfterSaveEvent<T>(objectToSave, dbDoc, collectionName));
}

và phương thức sẽ đặt id cho chúng tôi

protected void populateIdIfNecessary(Object savedObject, Object id) {

    if (id == null) {
        return;
    }

    if (savedObject instanceof BasicDBObject) {
        DBObject dbObject = (DBObject) savedObject;
        dbObject.put(ID_FIELD, id);
        return;
    }

    MongoPersistentProperty idProp = getIdPropertyFor(savedObject.getClass());

    if (idProp == null) {
        return;
    }

    ConversionService conversionService = mongoConverter.getConversionService();
    MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(savedObject.getClass());
    PersistentPropertyAccessor accessor = entity.getPropertyAccessor(savedObject);

    if (accessor.getProperty(idProp) != null) {
        return;
    }

    new ConvertingPropertyAccessor(accessor, conversionService).setProperty(idProp, id);
}

chúng ta có thể xem thực thể có phải là một lớp con của BasicDBObject hay không, nó sẽ đặt một id cho chúng ta.


0

Tôi nghĩ câu trả lời cho điều này là "Không".

Những gì bạn có thể làm là cung cấp cho _idchính bạn, theo cách thủ công hoặc triển khai CollectibleCodeccơ chế (chính xác là những gì BasicBDDocumenthiện có). Tuy nhiên, tất cả các giải pháp này liên quan đến việc tạo ID clientide.

Phải nói rằng, tôi không nghĩ rằng có bất kỳ vấn đề gì với việc tạo ra phía khách hàng _id.


-2

Đây là thao tác chèn:

DBCollection table1 = db.getCollection("Collection name");
BasicDBObject document = new BasicDBObject();
document.put("_id",value);      
document.put("Name", name);
table1.insert(document);

Sau khi chèn u nhận được id được chèn lần cuối:

DBCollection tableDetails = db.getCollection("collection name");
BasicDBObject queryDetails = new BasicDBObject();
queryDetails.put("_id", value);
DBCursor cursorDetails =tableDetails.find(queryDetails);
DBObject oneDetails;
oneDetails=cursorDetails.next();        
String data=oneDetails.get("_id").toString();
System.out.println(data);

sau khi nhận được giá trị chuyển đổi sang loại liên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.