2010-07-26 22 views

Odpowiedz

172

Nienawiść odpowiedzieć na moje własne pytanie, ale zdałem sobie sprawę, można to zrobić:

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

odpowiadając na własne pytanie jest [zachęcane] (http://stackoverflow.com/help/self-answer), nie martw się o to. –

+0

Dzięki za to. Czy wiesz, jak to zrobić, używając wiosennych danych mongodb? –

7

nie wiem o kierowcy Java ale dla potomności, komenda GetlastError można uruchomić, aby uzyskać _id z zapis, nawet upsert (od 1.5.4)

1

Po włożeniu dokumentu do kolekcji MongoDB, pomyślne wstawienie powinno zaktualizować wymagane pola (tj. _id). Możesz zapytać wstawiony obiekt dla _id.

7

Jest to bezpieczne

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

jeśli spojrzeć na kod sterownika

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

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

czy chcesz powiedzieć, że "można zapisać" lub "można to zrobić bezpiecznie"? – pd40

+1

Z jakiegoś powodu w MongoDB 2.2.2 (w przeciwieństwie do wcześniejszych, gdy byłem na 2.2.0) i ze sterownikiem Java 2.10.1, kod w odpowiedzi nie działa; po tym jak wstawiłem obiekt do dokumentu, nie mogę uzyskać jego _id, mimo że MongoDB wyraźnie generuje automatycznie ObjectId. Jednak twoje rozwiązanie ręcznego tworzenia ObjectId działa, a dzięki za tę opcję! –

+0

ten kod działa dobrze dla mnie, testowany na nowych wersjach mongo 2.2.2, sterownik 2.10.1 – zlob

-2

Jest to wkładka operacja:

DBCollection table1 = db.getCollection("Collection name"); 
BasicDBObject document = new BasicDBObject(); 
document.put("_id",value);  
document.put("Name", name); 
table1.insert(document); 

Po wkładką u get ostatni wstawiony id:

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

po uzyskaniu wartości przekonwertuj na typ inter.

6

Aby uniknąć odlew z Object do ObjectId, biorąc pod uwagę com.mongodb.client.MongoCollection collection i org.bson.Document doc, można wykonać następujące czynności:

collection.insert(doc); 
ObjectId id = doc.getObjectId("_id"); 
0

W MongoTemplate.class ma metodę

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

i metoda ustaw dla nas identyfikator

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

możemy zobaczyć, czy obiekt jest podklasą BasicDBObject, ustawi dla nas identyfikator.

Powiązane problemy