ID des zuletzt eingefügten Dokuments in einer MongoDB mit Java-Treiber abrufen

104

Gibt es eine einfache Möglichkeit, die ID (ObjectID) des zuletzt eingefügten Dokuments einer MongoDB-Instanz mithilfe des Java-Treibers abzurufen?

Matt W.
quelle

Antworten:

192

Ich habe gerade festgestellt, dass Sie dies tun können:

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

Um ein Casting von Objectbis ObjectIdmit a com.mongodb.client.MongoCollection collectionund a zu vermeiden org.bson.Document doc, können Sie Folgendes tun:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
quelle
Ich gehe davon aus, dass dies im 3.x Java-Treiber möglich wurde.
Jontia
12

Es ist sicher zu tun

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

Wenn Sie sich den Treibercode ansehen

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

public static ObjectId get(){
    return new ObjectId();
}
zlob
quelle
wolltest du sagen it's save to dooder it's safe to do?
pd40
1
Aus irgendeinem Grund funktioniert der Code in der Antwort in MongoDB 2.2.2 (im Gegensatz zu früher, als ich auf 2.2.0 war) und mit dem Java-Treiber 2.10.1 nicht. Nachdem ich das Objekt in das Dokument eingefügt habe, kann ich anscheinend seine _id nicht erhalten, obwohl MongoDB Objekt-IDs einfach automatisch generiert. Ihre Lösung zum manuellen Erstellen einer ObjectId funktioniert jedoch, und danke für diese Option!
Apophenia Overload
<code> BasicDBObject doc = neues BasicDBObject ("_ id", neue ObjectId ()); System.out.println ("doc.id before:" + doc.get ("_ id")); neuer Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id after:" + doc.get ("_ id")); </ code> Dieser Code funktioniert gut für mich, getestet auf neuen Versionen Mongo 2.2.2, Treiber 2.10.1
Zlob
7

Ich kenne den Java-Treiber nicht, aber für die Nachwelt kann der Befehl getLastError ausgeführt werden, um die _id eines Schreibvorgangs abzurufen, sogar eines Upsert (ab 1.5.4).

chx
quelle
4

Nachdem ein Dokument in die MongoDB-Sammlung eingefügt wurde, sollte das erfolgreiche Einfügen die erforderlichen Felder (nämlich _id) aktualisieren. Sie können das eingefügte Objekt nach der _id abfragen.

Ramesh
quelle
0

In MongoTemplate.class gibt es eine Methode

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

und die Methode wird ID für uns setzen

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

Wenn die Entität eine Unterklasse von BasicDBObject ist, wird eine ID für uns festgelegt.

Z. Billy
quelle
0

Ich denke, die Antwort darauf lautet "Nein".

Was Sie tun können, ist, sich _idselbst manuell zur Verfügung zu stellen oder den CollectibleCodecMechanismus zu implementieren (was genau das BasicBDDocumentist). Bei all diesen Lösungen wird jedoch die ID clientseitig generiert.

_idTrotzdem glaube ich nicht, dass es ein Problem gibt, die Client-Seite zu generieren.

Matthew
quelle
-2

Dies ist eine Einfügeoperation:

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

Nach dem Einfügen erhalten Sie die zuletzt eingefügte 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);

Nachdem Sie den Wert erhalten haben, konvertieren Sie ihn in inter type.

user27
quelle