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