Ottieni l'ID dell'ultimo documento inserito in un mongoDB con driver Java


104

Esiste un modo semplice per ottenere l'ID (ObjectID) dell'ultimo documento inserito di un'istanza mongoDB utilizzando il driver Java?

Risposte:


192

Ho appena capito che puoi farlo:

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

13

Per evitare di trasmettere da Objecta ObjectId, dati a com.mongodb.client.MongoCollection collectione a org.bson.Document doc, puoi fare quanto segue:

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

Presumo che questo sia diventato possibile nel driver java 3.x?
Jontia

12

È sicuro da fare

doc.set("_id", new ObjectId())

se guardi il codice del driver

if ( ensureID && id == null ){
    id = ObjectId.get();
    jo.put( "_id" , id );       
}

public static ObjectId get(){
    return new ObjectId();
}

volevi dire it's save to doo it's safe to do?
pd40

1
Per qualche ragione, in MongoDB 2.2.2 (a differenza di prima quando ero su 2.2.0) e con il driver Java 2.10.1, il codice nella risposta non funziona; dopo aver inserito l'oggetto nel documento, non riesco a ottenere il suo _id, anche se MongoDB genera chiaramente gli ObjectId. Tuttavia, la tua soluzione di creare manualmente un ObjectId funziona e grazie per questa opzione!
Sovraccarico di apofenia

<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("doc.id before:" + doc.get ("_ id")); new Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id dopo:" + doc.get ("_ id")); </code> questo codice funziona bene per me, testato sulle nuove versioni mongo 2.2.2, driver 2.10.1
zlob

7

Non conosco il driver Java ma per i posteri, il comando getLastError può essere eseguito per ottenere l'_id di una scrittura, anche un upsert (a partire dalla 1.5.4)


4

Dopo che un documento è stato inserito nella raccolta MongoDB, l'inserimento riuscito dovrebbe aggiornare i campi obbligatori (vale a dire _id). Puoi interrogare l'oggetto inserito per _id.


0

In MongoTemplate.class ha un metodo

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

e il metodo imposterà l'id per noi

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

possiamo vedere se l'entità è una sottoclasse di BasicDBObject, imposterà un id per noi.


0

Penso che la risposta a questa domanda sia "No".

Quello che puoi fare è fornire il tuo _idte stesso, manualmente o implementare il CollectibleCodecmeccanismo (che è esattamente ciò che BasicBDDocumentfa). Tuttavia, tutte queste soluzioni implicano la generazione dell'ID lato client.

Detto questo, non credo che ci siano problemi con la generazione del lato _idclient.


-2

Questa è l'operazione di inserimento:

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

Dopo aver inserito, ottieni l'ultimo ID inserito:

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

dopo aver ottenuto il valore convertire in inter type.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.