Javaドライバー付きのmongoDBに最後に挿入されたドキュメントのIDを取得する


104

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

回答:


192

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

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

13

からObjectへのキャストを回避するにはObjectId、a com.mongodb.client.MongoCollection collectionとaを指定org.bson.Document docして、次のようにします。

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

これは3.x Javaドライバで可能になったと思いますか?
Jontia

12

安全です

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

ドライバーコードを見れば

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

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

あなたは言うつもりでしたit's save to doit's safe to do
pd40 2012年

1
何らかの理由で、MongoDB 2.2.2(以前は2.2.0だったのとは対照的)およびJavaドライバー2.10.1では、回答のコードが機能しません。オブジェクトをドキュメントにアップサートした後、MongoDBがObjectIdを明示的に自動生成しても、その_idを取得できないようです。ただし、ObjectIdを手動で作成するソリューションは機能します。このオプションに感謝します!
アポフェニアオーバーロード

<code> BasicDBObject doc = new BasicDBObject( "_ id"、new ObjectId()); System.out.println( "doc.id before:" + doc.get( "_ id")); 新しいMongo( "localhost")。getDB( "test")。getCollection( "t")。insert(doc); System.out.println( "doc.id after:" + doc.get( "_ id")); </ code>このコードは私にとってはうまく機能し、新しいバージョンのmongo 2.2.2、ドライバー2.10.1でテストされています
zlob

7

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


4

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


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が設定されます。


0

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

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

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


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

値を取得した後、インタータイプに変換します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.