Obtenir l'ID du dernier document inséré dans un mongoDB avec pilote Java

104

Existe-t-il un moyen simple d'obtenir l'ID (ObjectID) du dernier document inséré d'une instance mongoDB à l'aide du pilote Java?

Matt W
la source

Réponses:

192

Je viens de réaliser que vous pouvez faire ceci:

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

Pour éviter de lancer de Objectvers ObjectId, étant donné a com.mongodb.client.MongoCollection collectionet a org.bson.Document doc, vous pouvez effectuer les opérations suivantes:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
la source
Je suppose que cela est devenu possible dans le pilote java 3.x?
Jontia le
12

C'est sûr de faire

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

si vous regardez le code du pilote

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

public static ObjectId get(){
    return new ObjectId();
}
zlob
la source
vouliez-vous dire it's save to doou it's safe to do?
pd40
1
Pour une raison quelconque, dans MongoDB 2.2.2 (par opposition à plus tôt lorsque j'étais sur 2.2.0) et avec le pilote Java 2.10.1, le code de la réponse ne fonctionne pas; après avoir inséré l'objet dans le document, je n'arrive pas à obtenir son _id, même si MongoDB génère automatiquement des ObjectId. Cependant, votre solution de création manuelle d'un ObjectId fonctionne, et merci pour cette option!
Apophenia Overload
<code> BasicDBObject doc = nouveau BasicDBObject ("_ id", nouvel ObjectId ()); System.out.println ("doc.id avant:" + doc.get ("_ id")); new Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id après:" + doc.get ("_ id")); </code> ce code fonctionne bien pour moi, testé sur les nouvelles versions mongo 2.2.2, driver 2.10.1
zlob
7

Je ne connais pas le pilote Java mais pour la postérité, la commande getLastError peut être exécutée pour obtenir le _id d'une écriture, même un upsert (à partir de 1.5.4)

chx
la source
4

Une fois qu'un document est inséré dans la collection MongoDB, l'insertion réussie doit mettre à jour les champs obligatoires (à savoir. _Id). Vous pouvez interroger l'objet inséré pour le _id.

Ramesh
la source
0

Dans MongoTemplate.class a une méthode

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

et la méthode définira l'id pour nous

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

nous pouvons voir si l'entité est une sous-classe de BasicDBObject, elle définira un identifiant pour nous.

Z.Billy
la source
0

Je pense que la réponse à cette question est «non».

Ce que vous pouvez faire est de vous fournir vous- _idmême, soit manuellement, soit d'implémenter le CollectibleCodecmécanisme (ce qui est exactement ce que BasicBDDocumentfait). Cependant, toutes ces solutions impliquent de générer l'ID côté client.

Cela dit, je ne pense pas qu'il y ait de problème avec la création du côté _idclient.

Matthieu
la source
-2

C'est l'opération d'insertion:

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

Après l'insertion, vous obtenez le dernier identifiant inséré:

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

après avoir obtenu la valeur convertie en type inter.

utilisateur27
la source