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?

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

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

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

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)


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.


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.


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.


-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.