在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(); }
为避免从Object
到ObjectId
,给定com.mongodb.client.MongoCollection collection
和org.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之后。