Câu trả lời:
Để tránh truyền từ Object
đến ObjectId
, cho trước a com.mongodb.client.MongoCollection collection
và a org.bson.Document doc
, bạn có thể làm như sau:
collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Nó an toàn để làm
doc.set("_id", new ObjectId())
nếu bạn 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();
}
it's save to do
hay it's safe to do
không?
Trong MongoTemplate.class có một phương thức
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 thức 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ể xem thực thể có phải là một lớp con của BasicDBObject hay không, nó sẽ đặt một id cho chúng ta.
Tôi nghĩ câu trả lời cho điều này là "Không".
Những gì bạn có thể làm là cung cấp cho _id
chính bạn, theo cách thủ công hoặc triển khai CollectibleCodec
cơ chế (chính xác là những gì BasicBDDocument
hiện có). Tuy nhiên, tất cả các giải pháp này liên quan đến việc tạo ID clientide.
Phải nói rằng, tôi không nghĩ rằng có bất kỳ vấn đề gì với việc tạo ra phía khách hàng _id
.
Đây là thao tác chèn:
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 nhận được id được chèn lần cuối:
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 nhận được giá trị chuyển đổi sang loại liên.