使用Java驱动程序获取mongoDB中最后插入的文档的ID


104

有没有一种简单的方法可以使用Java驱动程序获取mongoDB实例的最后插入文档的ID(ObjectID)?

Answers:


192

我刚刚意识到您可以这样做:

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

13

为了避免在ObjectObjectId定a com.mongodb.client.MongoCollection collection和a的情况下对from 进行强制转换org.bson.Document doc,您可以执行以下操作:

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

我假设这在3.x java驱动程序中成为可能?
Jontia

12

这是安全的

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

如果您查看驱动程序代码

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

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

你是说说it's save to do还是it's safe to do
2012年

1
出于某种原因,在MongoDB 2.2.2(与我在2.2.0之前的版本相反)和Java驱动程序2.10.1中,答案中的代码无法正常工作;将对象向上插入文档后,即使MongoDB明确地自动生成了ObjectId,我似乎也无法获得它的_id。但是,您手动创建ObjectId的解决方案确实有效,并且感谢您的选择!
重音过载

<code> BasicDBObject doc = new BasicDBObject(“ _ id”,new ObjectId()); System.out.println(“ doc.id before:” + doc.get(“ _ id”))); 新的Mongo(“ localhost”)。getDB(“ test”)。getCollection(“ t”)。insert(doc); System.out.println(“后面的doc.id:” + doc.get(“ _ id”))); </ code>此代码对我来说很好用,在新版本的mongo 2.2.2,驱动程序2.10.1上进行了测试
zlob 2013年

7

我不知道Java驱动程序,但是为了后代,可以运行getLastError命令来获取写入的_id,甚至是upsert(从1.5.4版开始)


4

将文档插入MongoDB集合后,成功插入应会更新必填字段(即_id)。您可以在插入的对象中查询_id。


0

在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。


0

我认为答案是“否”。

您可以做的是_id手动提供您自己的信息,或实施该CollectibleCodec机制(这正是BasicBDDocument它的作用)。但是,所有这些解决方案都涉及生成ID客户端。

话虽如此,我认为生成_id客户端没有任何问题。


-2

这是插入操作:

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

获取值后转换为Inter类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.