web-dev-qa-db-ja.com

Javaドライバを使用して、mongoDBに最後に挿入されたドキュメントのIDを取得します

Javaドライバを使用して、mongoDBインスタンスの最後に挿入されたドキュメントのID(ObjectID)を取得する簡単な方法はありますか?

100
Matt W

私はあなたがこれを行うことができることに気付きました:

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

安全です

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

ドライバーコードを見ると

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

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

ObjectからObjectIdへのキャストを回避するには、com.mongodb.client.MongoCollection collectionおよびorg.bson.Document doc、次のことができます。

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
8
Jadiel de Armas

Javaドライバーについては知りませんが、後世のために、getLastErrorコマンドを実行して書き込みの_idを取得できます(1.5.4以降)

7
chx

ドキュメントがMongoDBコレクションに挿入された後、正常に挿入されると、必須フィールド(viz。_id)が更新されます。 _idの挿入されたオブジェクトを照会できます。

2
Ramesh

これに対する答えは「いいえ」だと思います。

できることは、手動で_idを提供するか、CollectibleCodecメカニズムを実装することです(これはBasicBDDocumentが行うことです)。ただし、これらすべてのソリューションには、クライアントサイドのIDの生成が含まれます。

そうは言っても、_idクライアント側の生成に問題はないと思います。

0
Matthew

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
Z.Billy