是否有一种简单的方法可以使用Java驱动程序获取mongoDB实例的最后插入文档的ID(ObjectID)?
答案 0 :(得分:183)
我刚才意识到你可以这样做:
BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
答案 1 :(得分:10)
这样做是安全的
doc.set("_id", new ObjectId())
如果你看一下驱动程序代码
if ( ensureID && id == null ){
id = ObjectId.get();
jo.put( "_id" , id );
}
public static ObjectId get(){
return new ObjectId();
}
答案 2 :(得分:8)
为了避免从Object
投射到ObjectId
,给定com.mongodb.client.MongoCollection collection
和org.bson.Document doc
,您可以执行以下操作:
collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
答案 3 :(得分:7)
我不知道Java驱动程序,但是对于后代,可以运行getLastError命令来获取写入的_id,甚至是upsert(从1.5.4开始)
答案 4 :(得分:1)
将文档插入MongoDB集合后,成功插入应更新必填字段(即_id)。您可以查询插入的对象以查找_id。
答案 5 :(得分: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。
答案 6 :(得分:0)
我认为答案是“否”。
您可以做的是手动提供自己的_id
或实施CollectibleCodec
机制(这正是BasicBDDocument
的作用)。但是,所有这些解决方案都涉及生成ID客户端。
话虽如此,但我认为生成_id
客户端没有任何问题。
答案 7 :(得分:-1)
collection.insertMany(documentList).getInsertedIds();
collection.insertOne(document).getInsertedId();
答案 8 :(得分:-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类型后。