Javaドライバを使用して、mongoDBインスタンスの最後に挿入されたドキュメントのID(ObjectID)を取得する簡単な方法はありますか?
私はあなたがこれを行うことができることに気付きました:
BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
安全です
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");
Javaドライバーについては知りませんが、後世のために、getLastErrorコマンドを実行して書き込みの_idを取得できます(1.5.4以降)
ドキュメントがMongoDBコレクションに挿入された後、正常に挿入されると、必須フィールド(viz。_id)が更新されます。 _idの挿入されたオブジェクトを照会できます。
これに対する答えは「いいえ」だと思います。
できることは、手動で_id
を提供するか、CollectibleCodec
メカニズムを実装することです(これはBasicBDDocument
が行うことです)。ただし、これらすべてのソリューションには、クライアントサイドの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が設定されます。