Java 드라이버를 사용하여 mongoDB 인스턴스의 마지막으로 삽입 된 문서의 ID (ObjectID)를 쉽게 얻을 수있는 방법이 있습니까?
답변
나는 당신이 이것을 할 수 있다는 것을 깨달았습니다.
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();
}
답변
Java 드라이버에 대해서는 잘 모르지만 나중에는 getLastError 명령을 실행하여 쓰기의 _id, 심지어 upsert (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
클라이언트 측 생성에 문제가 없다고 생각합니다 .