2010-07-26 104 views

Respuesta

172

odio a responder a mi propia pregunta, pero me he dado cuenta de que puede hacer esto:

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

respondiendo su propia pregunta es [estimulado] (http://stackoverflow.com/help/self-answer), no se preocupe. –

+0

Gracias por esto. ¿Sabes cómo hacer lo mismo utilizando mongodb de datos de primavera? –

7

No sé sobre el controlador de Java, pero para la posteridad, el comando getLastError se puede ejecutar para obtener _ID de una escritura, incluso una inserción (a partir de 1.5.4)

1

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.

7

Es seguro hacerlo

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

si nos fijamos en código del controlador

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

public static ObjectId get(){ 
    return new ObjectId(); 
} 
+0

¿quisiste decir 'es guardar para hacer' o' es seguro hacerlo'? – 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 de Java 2.10.1, el código en la respuesta no funciona; después de que inserto el objeto en el documento, parece que no puedo obtener su _id, a pesar de que MongoDB simplemente genera automáticamente ObjectID. Sin embargo, su solución de crear manualmente un ObjectId funciona, ¡y gracias por esta opción! –

+0

BasicDBObject doc = new BasicDBObject("_id", new ObjectId()); System.out.println("doc.id before: " + doc.get("_id")); new Mongo("localhost").getDB("test").getCollection("t").insert(doc); System.out.println("doc.id after: " + doc.get("_id")); este código funciona bien para mí, probado en las nuevas versiones mongo 2.2.2, driver 2.10.1 – zlob

-2

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 inserción u obtener la última inserta Identificación:

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.

6

Para evitar la proyección de Object-ObjectId, dado un com.mongodb.client.MongoCollection collection y una org.bson.Document doc, puede hacer lo siguiente:

collection.insert(doc); 
ObjectId id = doc.getObjectId("_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 se 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.

Cuestiones relacionadas