Uzyskaj identyfikator ostatnio wstawionego dokumentu w mongoDB ze sterownikiem Java

104

Czy istnieje łatwy sposób na uzyskanie identyfikatora (ObjectID) ostatnio wstawionego dokumentu instancji mongoDB przy użyciu sterownika Java?

Matt W.
źródło

Odpowiedzi:

192

Właśnie zdałem sobie sprawę, że możesz to zrobić:

BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );
Matt W.
źródło
13

Aby uniknąć rzutowania z Objectdo ObjectId, biorąc pod uwagę a com.mongodb.client.MongoCollection collectioni a org.bson.Document doc, możesz wykonać następujące czynności:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
źródło
Zakładam, że stało się to możliwe w sterowniku java 3.x?
Jontia
12

To bezpieczne

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

jeśli spojrzysz na kod sterownika

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

public static ObjectId get(){
    return new ObjectId();
}
zlob
źródło
chciałeś powiedzieć it's save to doczy it's safe to do?
pd40
1
Z jakiegoś powodu w MongoDB 2.2.2 (w przeciwieństwie do wcześniejszego, kiedy byłem na 2.2.0) i ze sterownikiem Java 2.10.1, kod w odpowiedzi nie działa; po wstawieniu obiektu do dokumentu nie mogę uzyskać jego _id, mimo że MongoDB po prostu automatycznie generuje ObjectId. Jednak rozwiązanie polegające na ręcznym tworzeniu ObjectId działa i dziękujemy za tę opcję!
Apophenia Overload Overload
<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("doc.id before:" + doc.get ("_ id")); nowe Mongo ("localhost"). getDB ("test"). getCollection ("t"). insert (doc); System.out.println ("doc.id po:" + doc.get ("_ id")); </code> ten kod działa dobrze dla mnie, testowany na nowych wersjach mongo 2.2.2, sterownik 2.10.1
7

Nie wiem o sterowniku Java, ale dla potomności można uruchomić polecenie getLastError, aby uzyskać _id zapisu, a nawet upsert (od 1.5.4)

chx
źródło
4

Po wstawieniu dokumentu do kolekcji MongoDB, pomyślne wstawienie powinno zaktualizować wymagane pola (tj. _Id). Możesz zapytać wstawiony obiekt o identyfikator _id.

Ramesh
źródło
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));
}

a metoda ustawi dla nas id

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 jednostka jest podklasą BasicDBObject, ustawi dla nas identyfikator.

Z.Billy
źródło
0

Myślę, że odpowiedź na to pytanie brzmi „nie”.

To, co możesz zrobić, to dostarczyć _idsamodzielnie, ręcznie lub zaimplementować CollectibleCodecmechanizm (co dokładnie BasicBDDocumentrobi). Jednak wszystkie te rozwiązania obejmują generowanie ID po stronie klienta.

Powiedziawszy to, nie sądzę, że jest jakiś problem z generowaniem strony _idklienta.

Mateusz
źródło
-2

To jest operacja wstawiania:

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

Po wstawieniu otrzymujesz ostatnio wstawiony identyfikator:

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 zamień na typ inter.

user27
źródło