Obtenga el ID del último documento insertado en un controlador mongoDB con Java

104

¿Existe una manera fácil de obtener el ID (ObjectID) del último documento insertado de una instancia de mongoDB usando el controlador Java?

Matt W
fuente

Respuestas:

192

Me acabo de dar cuenta de que puedes hacer esto:

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

Para evitar la transmisión de Objecta ObjectId, dados a com.mongodb.client.MongoCollection collectiony a org.bson.Document doc, puedes hacer lo siguiente:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
fuente
¿Supongo que esto se hizo posible en el controlador java 3.x?
Jontia
12

Es seguro hacerlo

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();
}
zlob
fuente
¿Quisiste decir it's save to doo it's safe to do?
pd40
1
Por alguna razón, en MongoDB 2.2.2 (a diferencia de antes cuando estaba en 2.2.0) y con el controlador Java 2.10.1, el código de la respuesta no funciona; después de insertar el objeto en el documento, parece que no puedo obtener su _id, a pesar de que MongoDB genera automáticamente ObjectId. Sin embargo, su solución de crear manualmente un ObjectId funciona, ¡y gracias por esta opción!
Sobrecarga de apophenia
<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("doc.id antes:" + doc.get ("_ id")); new Mongo ("localhost"). getDB ("prueba"). getCollection ("t"). insert (doc); System.out.println ("doc.id después de:" + doc.get ("_ id")); </code> este código funciona bien para mí, probado en nuevas versiones mongo 2.2.2, controlador 2.10.1
zlob
7

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 un upsert (a partir de 1.5.4)

chx
fuente
4

Una vez que se inserta un documento en la colección MongoDB, la inserción correcta debe actualizar los campos obligatorios (a saber, _id). Puede consultar el objeto insertado para el _id.

Ramesh
fuente
0

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á la identificación 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, establecerá una identificación para nosotros.

Z.Billy
fuente
0

Creo que la respuesta a esto es "No".

Lo que puede hacer es proporcionarse usted _idmismo, ya sea manualmente o implementar el CollectibleCodecmecanismo (que es exactamente lo queBasicBDDocument hace). Sin embargo, todas estas soluciones implican generar el ID del lado del cliente.

Habiendo dicho eso, no creo que haya ningún problema con generar el lado del _idcliente.

Mateo
fuente
-2

Esta es la 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 identificación 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 tipo inter.

usuario27
fuente