sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoTemplate upsert:¿una forma fácil de actualizar desde pojo (qué usuario ha editado)?

Encontré una solución bastante buena para esta pregunta

//make a new description here
Description d = new Description();
d.setCode("no");
d.setName("norwegian");
d.setNorwegian("norwegian");
d.setEnglish("english");

//build query
Query query = new Query(Criteria.where("code").is(description.getCode()));

//build update
DBObject dbDoc = new BasicDBObject();
mongoTemplate.getConverter().write(d, dbDoc); //it is the one spring use for convertions.
Update update = Update.fromDBObject(dbDoc);

//run it!
mongoTemplate.upsert(query, update, "descriptions");

Tenga en cuenta que Update.fromDBObject devuelve un objeto de actualización con todos los campos en dbDoc. Si solo desea actualizar campos no nulos, debe codificar un nuevo método para excluir campos nulos.

Por ejemplo, el front-end publica un documento como el siguiente:

//make a new description here
Description d = new Description();
d.setCode("no");
d.setEnglish("norwegian");

Solo necesitamos actualizar el campo 'idioma':

//return Update object
public static Update fromDBObjectExcludeNullFields(DBObject object) {
    Update update = new Update();       
    for (String key : object.keySet()) {
        Object value = object.get(key);
        if(value!=null){
            update.set(key, value);
        }
    }
    return update;
}

//build udpate
Update update = fromDBObjectExcludeNullFields(dbDoc);