Java 드라이버가있는 mongoDB에서 마지막으로 삽입 된 문서의 ID 가져 오기


104

Java 드라이버를 사용하여 mongoDB 인스턴스의 마지막으로 삽입 된 문서의 ID (ObjectID)를 쉽게 얻을 수있는 방법이 있습니까?

답변:


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에서는 답변의 코드가 작동하지 않습니다. 문서에 개체를 upsert 한 후 MongoDB가 ObjectId를 자동으로 생성하더라도 _id를 얻을 수없는 것 같습니다. 그러나 수동으로 ObjectId를 만드는 솔루션은 작동하며이 옵션에 감사드립니다!
아포 페니아 과부하

<code> BasicDBObject doc = new BasicDBObject ( "_ id", new ObjectId ()); System.out.println ( "doc.id 이전 :"+ doc.get ( "_ id")); new Mongo ( "localhost"). getDB ( "test"). getCollection ( "t"). insert (doc); System.out.println ( "doc.id after :"+ doc.get ( "_ id")); </ code>이 코드는 저에게 잘 작동하며, 새 버전
mongo

7

Java 드라이버에 대해서는 잘 모르지만 나중에는 getLastError 명령을 실행하여 쓰기의 _id, 심지어 upsert (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);

삽입 후 마지막으로 삽입 된 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);

값을 얻은 후 inter 유형으로 변환하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.