รับ ID ของเอกสารที่แทรกล่าสุดใน mongoDB พร้อมไดรเวอร์ Java


104

มีวิธีง่ายๆในการรับ ID (ObjectID) ของเอกสารที่แทรกล่าสุดของอินสแตนซ์ mongoDB โดยใช้ไดรเวอร์ Java หรือไม่?

คำตอบ:


192

ฉันเพิ่งรู้ว่าคุณสามารถทำได้:

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

13

เพื่อหลีกเลี่ยงการแคสต์จากObjectถึงObjectIda com.mongodb.client.MongoCollection collectionและ a org.bson.Document docคุณสามารถทำสิ่งต่อไปนี้:

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

ฉันสมมติว่าสิ่งนี้เป็นไปได้ในไดรเวอร์จาวา 3.x?
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 doหรือit's safe to do?
pd40

1
ด้วยเหตุผลบางประการใน MongoDB 2.2.2 (ตรงข้ามกับก่อนหน้านี้เมื่อฉันใช้ 2.2.0) และด้วยไดรเวอร์ Java 2.10.1 รหัสในคำตอบไม่ทำงาน หลังจากที่ฉันใส่วัตถุลงในเอกสารดูเหมือนว่าฉันจะไม่สามารถรับ _id ของมันได้แม้ว่า MongoDB จะสร้าง ObjectId โดยอัตโนมัติก็ตาม อย่างไรก็ตามโซลูชันของคุณในการสร้าง ObjectId ด้วยตนเองใช้งานได้และขอขอบคุณสำหรับตัวเลือกนี้!
Apophenia Overload

<code> BasicDBObject doc = BasicDBObject ใหม่ ("_ id", ObjectId ใหม่ ()); System.out.println ("doc.id before:" + doc.get ("_ id")); Mongo ใหม่ ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id หลัง:" + doc.get ("_ id")); </code> รหัสนี้ทำงานได้ดีสำหรับฉันทดสอบกับเวอร์ชันใหม่ mongo 2.2.2 ไดรเวอร์ 2.10.1
zlob

7

ฉันไม่รู้เกี่ยวกับไดรเวอร์ Java แต่สำหรับรุ่นหลังคำสั่ง getLastError สามารถเรียกใช้เพื่อรับ _id ของการเขียนแม้กระทั่งการอัปเดต (ณ 1.5.4)


4

หลังจากใส่เอกสารลงในคอลเลคชัน MongoDB แล้วการแทรกที่สำเร็จควรอัปเดตฟิลด์ที่จำเป็น (ได้แก่ _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);

หลังจากใส่แล้วคุณจะได้รับรหัสที่แทรกล่าสุด:

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.