2010-07-26 33 views

Trả lời

172

Hate để trả lời câu hỏi của riêng tôi, nhưng tôi chỉ nhận ra bạn có thể làm điều này:

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

trả lời câu hỏi của riêng bạn là [khuyến khích] (http://stackoverflow.com/help/self-answer), đừng lo lắng về điều đó. –

+0

Cảm ơn vì điều này. Bạn có biết làm thế nào để làm tương tự bằng cách sử dụng dữ liệu mùa xuân mongodb? –

7

Tôi không biết về trình điều khiển Java nhưng cho hậu thế, lệnh GetLastError có thể được chạy để có được những _id của một ghi, thậm chí là một upsert (như 1.5.4)

1

Sau khi một tài liệu được chèn vào bộ sưu tập MongoDB, việc chèn thành công sẽ cập nhật các trường bắt buộc (viz. _id). Bạn có thể truy vấn đối tượng được chèn cho _id.

7

Đó là an toàn để làm

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

nếu quý vị nhìn vào mã trình điều khiển

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

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

có phải bạn muốn nói 'nó tiết kiệm để làm' hoặc' an toàn để làm'? – pd40

+1

Vì một số lý do, trong MongoDB 2.2.2 (trái ngược với trước đó khi tôi ở trên 2.2.0) và với trình điều khiển Java 2.10.1, mã trong câu trả lời không hoạt động; sau khi tôi đưa đối tượng vào tài liệu, tôi dường như không thể nhận được _id của nó, mặc dù MongoDB tự động tạo ra ObjectId một cách rõ ràng. Tuy nhiên, giải pháp của bạn bằng tay tạo ObjectId không hoạt động, và cảm ơn cho tùy chọn này! –

+0

BasicDBObject doc = new BasicDBObject("_id", new ObjectId()); System.out.println("doc.id before: " + doc.get("_id")); new Mongo("localhost").getDB("test").getCollection("t").insert(doc); System.out.println("doc.id after: " + doc.get("_id")); mã này hoạt động tốt cho tôi, được thử nghiệm trên các phiên bản mới mongo 2.2.2, trình điều khiển 2.10.1 – zlob

-2

này là chèn hoạt động:

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

Sau khi chèn u được cuối cùng chèn 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); 

sau khi chuyển đổi giá trị thành loại liên.

6

Để tránh đúc Object-ObjectId, cho một com.mongodb.client.MongoCollection collectionorg.bson.Document doc, bạn có thể làm như sau:

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

Trong MongoTemplate.class có một phương pháp

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

và phương pháp sẽ đặt id cho chúng tôi

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

chúng ta có thể thấy nếu thực thể là một lớp con của BasicDBObject, nó sẽ thiết lập một id cho chúng ta.

Các vấn đề liên quan