Отримайте ідентифікатор останнього вставленого документа у драйвері mongoDB w / Java


104

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

Відповіді:


192

Я щойно зрозумів, що ти можеш це зробити:

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

13

Для того, щоб уникнути виливки з Objectдо ObjectId, з огляду на com.mongodb.client.MongoCollection collectionі org.bson.Document doc, ви можете зробити наступне:

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

Я припускаю, що це стало можливим у драйвері Java 3.x?
Джонтія

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 справді працює, і дякую за цю опцію!
Перенавантаження Апофенії

<code> BasicDBObject doc = новий BasicDBObject ("_ id", новий ObjectId ()); System.out.println ("doc.id раніше:" + doc.get ("_ id")); новий Mongo ("localhost"). getDB ("тест"). getCollection ("t"). insert (doc); System.out.println ("doc.id після:" + doc.get ("_ id")); </code> цей код добре працює для мене, протестований на нових версіях mongo 2.2.2, драйвер 2.10.1
zlob

7

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


4

Після того, як документ буде вставлено в колекцію MongoDB, для успішного вставки слід оновити необхідні поля (а саме _ _). Ви можете запитувати вставлений об'єкт для _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.

Сказавши це, я не думаю, що існує проблема із створенням _idклієнтської сторони .


-2

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

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

Після вставки u отримують останній вставлений ідентифікатор:

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

після отримання значення конвертувати в інтер-тип.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.