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?

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

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

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

¿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)


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.


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.


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.