ejemplos - Obtenga la identificación del último documento insertado en un controlador mongoDB con Java
mongodb java find by id (7)
¿Hay una manera fácil de obtener el ID (ObjectID) del último documento insertado de una instancia de mongoDB utilizando el controlador de Java?
Después de insertar un documento en la colección MongoDB, la inserción correcta debería actualizar los campos obligatorios (a saber, _id). Puede consultar el objeto insertado para el _id.
En MongoTemplate.class tiene un método
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));
}
y el método establecerá id para nosotros
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);
}
podemos ver si la entidad es una subclase de BasicDBObject, nos establecerá una identificación.
Es seguro hacer
doc.set("_id", new ObjectId())
si miras el código del conductor
if ( ensureID && id == null ){
id = ObjectId.get();
jo.put( "_id" , id );
}
public static ObjectId get(){
return new ObjectId();
}
Esta es una operación de inserción:
DBCollection table1 = db.getCollection("Collection name");
BasicDBObject document = new BasicDBObject();
document.put("_id",value);
document.put("Name", name);
table1.insert(document);
Después de insertar, obtienes la última ID insertada:
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);
después de obtener el valor convertir a inter-tipo.
No sé sobre el controlador de Java, pero para la posteridad, el comando getLastError se puede ejecutar para obtener el _id de una escritura, incluso una inserción (a partir de 1.5.4)
Odio responder mi propia pregunta, pero me di cuenta de que puedes hacer esto:
BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
Para evitar el com.mongodb.client.MongoCollection collection
de Object
a ObjectId
, una com.mongodb.client.MongoCollection collection
y un org.bson.Document doc
, puede hacer lo siguiente:
collection.insert(doc);
ObjectId id = doc.getObjectId("_id");