我正在使用Spring Data for MongoDB -1.4.1.RELEASE和MongoDB 2.4.9
我正在使用mongoOperations.save()来更新实体。
在previouse版本上,1.2.0.RELEASE(由于一个错误:DATAMONGO-571)我过去通过将其值设置为null来排除某些属性。
现在,这个错误已修复,我无法这样做,但我仍然需要从保存操作中排除一些属性(如果是更新)。
有人知道如何实现这一目标吗?
答案 0 :(得分:1)
MongoTemplate
有专门的方法来执行部分更新,例如:
updateFirst(…)
- 更新符合给定条件的第一个文档。updateMulti(…)
- 更新符合给定条件的所有文件。答案 1 :(得分:1)
我编写了抽象存储库,它对单个对象进行部分更新。它希望该对象包含' id'字段。
package xxx;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
import java.io.Serializable;
import java.util.Map;
public abstract class ExtendedMongoRepository<T, ID extends Serializable> extends SimpleMongoRepository<T, ID> {
private Class<T> clazz;
//hidden constructor
private ExtendedMongoRepository(MongoEntityInformation metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
}
public ExtendedMongoRepository(MongoRepositoryFactory mongoRepositoryFactory, MongoOperations mongoOperations, Class<T> clazz) {
this(mongoRepositoryFactory.<T, ID>getEntityInformation(clazz), mongoOperations);
this.clazz = clazz;
}
protected Query getByIdQuery(ID id) {
return new Query(Criteria.where("_id").is(id));
}
/**
* Partial object update
* @param entity
* @param id
* @return
*/
public T updatePartial(T entity, ID id) {
ObjectMapper objectMapper = new ObjectMapper();
//exclude null
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Map<String, Object> objectAsMap = objectMapper.convertValue(entity, Map.class);
//exclude id
objectAsMap.remove("id");
//add fields to update
Update u = new Update();
for (Map.Entry<String, Object> e : objectAsMap.entrySet()) {
u.set(e.getKey(), e.getValue());
}
getMongoOperations().updateFirst(getByIdQuery(id), u, clazz);
return getMongoOperations().findById(id, clazz);
}
}
以及如何使用它的示例。
public class GroupRepository extends ExtendedMongoRepository<Group, String> {
@Autowired
public GroupRepository(MongoRepositoryFactory mongoRepositoryFactory, MongoOperations mongoOperations) {
super(mongoRepositoryFactory, mongoOperations, Group.class);
}
}