Obter ID do último documento inserido em um driver mongoDB com Java

104

Existe uma maneira fácil de obter o ID (ObjectID) do último documento inserido de uma instância mongoDB usando o driver Java?

Matt W
fonte

Respostas:

192

Acabei de perceber que você pode fazer isso:

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

Para evitar a transmissão de Objectpara ObjectId, dados a com.mongodb.client.MongoCollection collectione a org.bson.Document doc, você pode fazer o seguinte:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
Jadiel de Armas
fonte
Estou assumindo que isso se tornou possível no driver java 3.x.
Jontia,
12

É seguro fazer

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

se você olhar para o código do driver

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

public static ObjectId get(){
    return new ObjectId();
}
zlob
fonte
você quis dizer it's save to doou it's safe to do?
pd40
1
Por alguma razão, no MongoDB 2.2.2 (ao contrário de antes, quando eu estava no 2.2.0) e com o driver Java 2.10.1, o código na resposta não funciona; depois de fazer o upsert do objeto no documento, não consigo obter seu _id, embora o MongoDB gere automaticamente ObjectId's. No entanto, sua solução de criar manualmente um ObjectId funciona, e obrigado por esta opção!
Sobrecarga de apofenia
<code> 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")); </code> este código funciona bem para mim, testado nas novas versões mongo 2.2.2, driver 2.10.1
zlob
7

Não sei sobre o driver Java, mas para a posteridade, o comando getLastError pode ser executado para obter o _id de uma gravação, mesmo um upsert (a partir de 1.5.4)

chx
fonte
4

Depois que um documento é inserido na coleção do MongoDB, a inserção bem-sucedida deve atualizar os campos obrigatórios (viz. _Id). Você pode consultar o objeto inserido para o _id.

Ramesh
fonte
0

Em MongoTemplate.class tem um 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));
}

e o método definirá o id para nós

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 se a entidade é uma subclasse de BasicDBObject, ela definirá um id para nós.

Z.Billy
fonte
0

Acho que a resposta é "Não".

O que você pode fazer é fornecer seu _idpróprio, manualmente, ou implementar o CollectibleCodecmecanismo (que é exatamente o que BasicBDDocumentfaz). No entanto, todas essas soluções envolvem a geração da ID do cliente.

Dito isso, não acho que haja nenhum problema em gerar o _idlado do cliente.

Mateus
fonte
-2

Esta é a operação de inserção:

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

Após inserir você obtém o último id inserido:

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

depois de obter o valor, converta em intertipo.

usuário 27
fonte