在mongoDB w / Java驱动程序中获取最后插入的文档的ID

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

讨厌回答我自己的问题,但我只是意识到你可以做到这一点:

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

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

这是安全的

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

如果你看看驱动程序代码

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

为避免从ObjectObjectId ,给定com.mongodb.client.MongoCollection collectionorg.bson.Document doc ,您可以执行以下操作:

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

将文档插入到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。

这是插入操作:

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

得到值转换为intertypes之后。