从保存操作中排除null属性

时间:2014-04-06 13:11:41

标签: mongodb spring-data spring-data-mongodb

我正在使用Spring Data for MongoDB -1.4.1.RELEASE和MongoDB 2.4.9

我正在使用mongoOperations.save()来更新实体。

在previouse版本上,1.2.0.RELEASE(由于一个错误:DATAMONGO-571)我过去通过将其值设置为null来排除某些属性。

现在,这个错误已修复,我无法这样做,但我仍然需要从保存操作中排除一些属性(如果是更新)。

有人知道如何实现这一目标吗?

2 个答案:

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