Dapatkan ID dari dokumen yang dimasukkan terakhir dalam mongoDB w / driver Java

104

Apakah ada cara mudah untuk mendapatkan ID (ObjectID) dari dokumen yang terakhir disisipkan dari instance mongoDB menggunakan driver Java?

Matt W.
sumber

Jawaban:

192

Saya baru sadar Anda bisa melakukan ini:

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

Untuk menghindari transmisi dari Objectke ObjectId, dengan a com.mongodb.client.MongoCollection collectiondan a org.bson.Document doc, Anda dapat melakukan hal berikut:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
sumber
Saya berasumsi ini menjadi mungkin di driver java 3.x?
Jontia
12

Aman untuk dilakukan

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

jika Anda melihat kode driver

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

public static ObjectId get(){
    return new ObjectId();
}
zlob
sumber
apakah Anda bermaksud mengatakan it's save to doatau it's safe to do?
pd40
1
Untuk beberapa alasan, di MongoDB 2.2.2 (berbeda dengan sebelumnya ketika saya menggunakan 2.2.0) dan dengan driver Java 2.10.1, kode di jawaban tidak berfungsi; setelah saya memasukkan objek ke dalam dokumen, saya tidak bisa mendapatkan _id-nya, meskipun MongoDB secara jelas membuat ObjectId secara otomatis. Namun, solusi Anda untuk membuat ObjectId secara manual berfungsi, dan terima kasih untuk opsi ini!
Apophenia Overload
<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("doc.id sebelum:" + doc.get ("_ id")); Mongo baru ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id setelah:" + doc.get ("_ id")); </code> kode ini bekerja dengan baik untuk saya, diuji pada versi baru mongo 2.2.2, driver 2.10.1
zlob
7

Saya tidak tahu tentang driver Java tetapi untuk anak cucu, perintah getLastError dapat dijalankan untuk mendapatkan _id dari penulisan, bahkan upert (mulai 1.5.4)

chx
sumber
4

Setelah dokumen dimasukkan ke dalam koleksi MongoDB, penyisipan yang berhasil harus memperbarui bidang yang diperlukan (yaitu. _Id). Anda dapat meminta objek yang disisipkan untuk _id.

Ramesh
sumber
0

Di MongoTemplate.class memiliki metode

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

dan metode akan menetapkan id untuk kita

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

kita dapat melihat apakah entitas tersebut adalah sub-kelas dari BasicDBObject, itu akan menetapkan id untuk kita.

Z.Billy
sumber
0

Saya pikir jawabannya adalah "Tidak".

Apa yang dapat Anda lakukan adalah menyediakan _iddiri Anda, baik secara manual, atau menerapkan CollectibleCodecmekanisme (yang persis seperti BasicBDDocumentitu). Namun semua solusi ini melibatkan pembuatan ID di sisi klien.

Karena itu, saya tidak berpikir ada masalah dengan menghasilkan sisi _idklien.

Matthew
sumber
-2

Ini adalah operasi penyisipan:

DBCollection table1 = db.getCollection("Collection name");
BasicDBObject document = new BasicDBObject();
document.put("_id",value);      
document.put("Name", name);
table1.insert(document);

Setelah memasukkan Anda mendapatkan id yang terakhir dimasukkan:

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

setelah mendapatkan nilai convert ke inter type.

pengguna27
sumber