Получить идентификатор последнего вставленного документа в mongoDB с драйвером Java

104

Есть ли простой способ получить идентификатор (ObjectID) последнего вставленного документа экземпляра mongoDB с помощью драйвера Java?

Мэтт В
источник

Ответы:

192

Я только что понял, что ты можешь это сделать:

BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
Мэтт В
источник
13

Чтобы избежать преобразования из Objectв ObjectId, для заданных a com.mongodb.client.MongoCollection collectionи a org.bson.Document doc, вы можете сделать следующее:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Джадиэль де Армас
источник
Я предполагаю, что это стало возможным в java-драйвере 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, код в ответе не работает; после того, как я вставил объект в документ, я не могу получить его _id, хотя MongoDB явно автоматически генерирует ObjectId. Однако ваше решение по созданию ObjectId вручную действительно работает, и спасибо за этот вариант!
Apophenia Overload
<code> BasicDBObject doc = new BasicDBObject ("_ id", новый ObjectId ()); System.out.println ("doc.id до:" + doc.get ("_ id")); новый Mongo ("локальный хост"). getDB ("тест"). getCollection ("т"). вставить (документ); System.out.println ("doc.id после:" + doc.get ("_ id")); </code> у меня этот код работает хорошо, протестирован на новых версиях mongo 2.2.2, драйвер 2.10.1
zlob
7

Я не знаю о драйвере Java, но для потомков команду getLastError можно запустить, чтобы получить _id записи, даже upsert (начиная с 1.5.4)

chx
источник
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));
}

и метод установит нам идентификатор

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, он установит для нас идентификатор.

З. Билли
источник
0

Я думаю, что ответ на это «Нет».

Что вы можете сделать, так это предоставить _idсебя вручную или реализовать CollectibleCodecмеханизм (что и BasicBDDocumentделает). Однако все эти решения включают создание идентификатора на стороне клиента.

Сказав это, я не думаю, что есть проблема с созданием _idклиентской части.

Мэтью
источник
-2

Это операция вставки:

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

после получения значения преобразовать в тип inter.

user27
источник