Java sürücüsü ile mongoDB'ye son eklenen belgenin kimliğini alın


104

Java sürücüsünü kullanarak bir mongoDB örneğinin son eklenen belgesinin kimliğini (Nesne Kimliği) almanın kolay bir yolu var mı?

Yanıtlar:


192

Bunu yapabileceğini fark ettim:

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

13

A ve a verilen bir noktadan arasında Objectgeçiş yapmaktan kaçınmak için aşağıdakileri yapabilirsiniz:ObjectIdcom.mongodb.client.MongoCollection collectionorg.bson.Document doc

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

Bunun 3.x java sürücüsünde mümkün olduğunu varsayıyorum?
Jontia

12

Yapmak güvenli

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

sürücü koduna bakarsan

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

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

Yani demek ki it's save to doya it's safe to do?
pd40

1
Bazı nedenlerden dolayı, MongoDB 2.2.2'de (2.2.0'da daha önceki sürümün aksine) ve Java sürücüsü 2.10.1 ile, yanıttaki kod çalışmıyor; Nesneyi belgeye yükselttikten sonra, MongoDB açıkça ObjectId'leri otomatik oluştursa da _id'sini alamıyorum. Ancak, manuel olarak bir ObjectId oluşturma çözümünüz işe yarıyor ve bu seçenek için teşekkürler!
Apophenia Overload

<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("önce doc.id:" + doc.get ("_ id")); yeni Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id sonra:" + doc.get ("_ id")); </code> bu kod benim için iyi çalışıyor, mongo 2.2.2, sürücü 2.10.1 yeni sürümlerinde test edildi
zlob

7

Java sürücüsünü bilmiyorum, ancak gelecek nesil için getLastError komutu bir yazma işleminin _id'ini, hatta bir upert'i (1.5.4 itibariyle) almak için çalıştırılabilir.


4

MongoDB koleksiyonuna bir belge eklendikten sonra, başarılı ekleme gerekli alanları (viz. _İd) güncellemelidir. _İd için eklenen nesneyi sorgulayabilirsiniz.


0

MongoTemplate.class'ta bir yöntem var

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

ve yöntem bizim için kimliği belirleyecek

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

varlığın BasicDBObject'in bir alt sınıfı olup olmadığını görebiliriz, bizim için bir id belirleyecektir.


0

Bunun cevabının "Hayır" olduğunu düşünüyorum.

Yapabilecekleriniz, _idkendiniz için manuel olarak sağlamak veya CollectibleCodecmekanizmayı uygulamaktır (tam olarakBasicBDDocument yapar). Bununla birlikte, tüm bu çözümler, ID istemcisi oluşturmayı içerir.

Bunu söyledikten sonra, _idmüşteri tarafı oluşturmada herhangi bir sorun olduğunu düşünmüyorum.


-2

Bu, ekleme işlemidir:

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

Ekledikten sonra son eklenen kimliği alın:

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

değeri aldıktan sonra inter tipe dönüştürün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.