มีวิธีง่ายๆในการรับ ID (ObjectID) ของเอกสารที่แทรกล่าสุดของอินสแตนซ์ mongoDB โดยใช้ไดรเวอร์ Java หรือไม่?
มีวิธีง่ายๆในการรับ ID (ObjectID) ของเอกสารที่แทรกล่าสุดของอินสแตนซ์ mongoDB โดยใช้ไดรเวอร์ Java หรือไม่?
คำตอบ:
ฉันเพิ่งรู้ว่าคุณสามารถทำได้:
BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
เพื่อหลีกเลี่ยงการแคสต์จากObject
ถึงObjectId
a com.mongodb.client.MongoCollection collection
และ a org.bson.Document doc
คุณสามารถทำสิ่งต่อไปนี้:
collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
ปลอดภัยที่จะทำ
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
?
ฉันไม่รู้เกี่ยวกับไดรเวอร์ Java แต่สำหรับรุ่นหลังคำสั่ง getLastError สามารถเรียกใช้เพื่อรับ _id ของการเขียนแม้กระทั่งการอัปเดต (ณ 1.5.4)
หลังจากใส่เอกสารลงในคอลเลคชัน MongoDB แล้วการแทรกที่สำเร็จควรอัปเดตฟิลด์ที่จำเป็น (ได้แก่ _id) คุณสามารถสอบถามวัตถุที่แทรกสำหรับ _id
ใน 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 ให้เรา
ฉันคิดว่าคำตอบนี้คือ "ไม่"
สิ่งที่คุณทำได้คือจัดหา_id
ตัวคุณเองไม่ว่าจะด้วยตนเองหรือใช้CollectibleCodec
กลไก (ซึ่งก็คือสิ่งที่BasicBDDocument
ทำ) อย่างไรก็ตามโซลูชันทั้งหมดนี้เกี่ยวข้องกับการสร้าง ID ไคลเอนต์
ต้องบอกว่าฉันไม่คิดว่าจะมีปัญหาในการสร้าง_id
ลูกค้า
นี่คือการดำเนินการแทรก:
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);
หลังจากได้รับค่าแปลงเป็นประเภทอินเตอร์