web-dev-qa-db-fra.com

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

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

92
Matt W

Déteste répondre à ma propre question, mais je viens de me rendre compte que vous pouvez faire ceci:

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

C'est sûr de faire 

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

si vous regardez le code du conducteur 

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

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

Pour éviter le passage de Object à ObjectId, à l'aide d'un com.mongodb.client.MongoCollection collection et d'un org.bson.Document doc, vous pouvez procéder comme suit:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
8
Jadiel de Armas

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 d'un upsert (à partir de 1.5.4)

7
chx

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.

1
Ramesh

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

Ce que vous pouvez faire est de fournir votre _id vous-même, soit manuellement, soit de mettre en œuvre le mécanisme CollectibleCodec (qui correspond exactement à ce que BasicBDDocument fait). Cependant, toutes ces solutions impliquent de générer l’ID côté client.

Cela dit, je ne pense pas que la génération de _id côté client soit un problème.

0
Matthew

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 va définir 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
Z.Billy