簡體   English   中英

在帶有 Java 驅動程序的 mongoDB 中獲取最后插入文檔的 ID

[英]Get ID of last inserted document in a mongoDB w/ Java driver

是否有一種簡單的方法可以使用 Java 驅動程序獲取 mongoDB 實例的最后插入文檔的 ID (ObjectID)?

我剛剛意識到你可以這樣做:

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

為了避免從ObjectObjectId ,給定com.mongodb.client.MongoCollection collectionorg.bson.Document doc ,您可以執行以下操作:

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

這樣做是安全的

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

如果您查看驅動程序代碼

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

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

我不知道 Java 驅動程序,但為了后代,可以運行 getLastError 命令來獲取寫入的 _id,甚至是 upsert(從 1.5.4 開始)

將文檔插入 MongoDB 集合后,成功插入應更新必填字段(即 _id)。 您可以查詢插入的對象的 _id。

在 MongoTemplate.class 中有一個方法

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));
}

該方法將為我們設置 id

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);
}

我們可以看到實體是否是 BasicDBObject 的子類,它會為我們設置一個 id。

我認為這個問題的答案是“不”。

您可以做的是自己提供_id ,或者手動提供,或者實現CollectibleCodec機制(這正是BasicBDDocument所做的)。 然而,所有這些解決方案都涉及生成 ID 客戶端。

話雖如此,我認為生成_id客戶端沒有任何問題。

有沒有一種簡單的方法可以使用Java驅動程序獲取mongoDB實例最后插入的文檔的ID(對象ID)?

這是插入操作:

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

插入后你得到最后插入的id:

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);

獲取值后轉換為內部類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM