SpringData Mongo投影忽略并覆盖保存时的值
让我解释一下SpringData mongo的问题,我声明了以下接口,我声明了一个自定义查询,使用一个投影来忽略索引,这个示例仅用于说明,在现实生活中我将忽略一组字段SpringData Mongo投影忽略并覆盖保存时的值,spring,mongodb,spring-boot,spring-data,Spring,Mongodb,Spring Boot,Spring Data,让我解释一下SpringData mongo的问题,我声明了以下接口,我声明了一个自定义查询,使用一个投影来忽略索引,这个示例仅用于说明,在现实生活中我将忽略一组字段 public interface MyDomainRepo extends MongoRepository<MyDomain, String> { @Query(fields="{ index: 0 }") MyDomain findByCode(String code); } 因
public interface MyDomainRepo extends MongoRepository<MyDomain, String> {
@Query(fields="{ index: 0 }")
MyDomain findByCode(String code);
}
因此,我使用了MyDomainRepo中的save
,该索引按预期被投影忽略,但是,当我将其保存回时,无论是否更新,SpringData Mongo都会将index
属性覆盖为null,因此,我在MongoDB实例上的记录也会被覆盖,下面的示例是我的MongoDB JSON
{
"_id": "5f061f9011b7cb497d4d2708",
"info": "myinfo",
"_class": "io.springmongo.models.MyDomain"
}
有一种方法可以告诉SpringData Mongo,在保存时忽略空字段?- 保存是一个替换操作,您将无法向其发送信号以修补某些字段。它将用您发送的任何内容替换文档
- 您可以选择使用Spring数据存储库提供的扩展来定义自定义存储库方法
{
"_id": "5f061f9011b7cb497d4d2708",
"info": "myinfo",
"_class": "io.springmongo.models.MyDomain"
}
public interface MyDomainRepositoryCustom {
void updateNonNull(MyDomain myDomain);
}
public class MyDomainRepositoryImpl implements MyDomainRepositoryCustom {
private final MongoTemplate mongoTemplate;
@Autowired
public BookRepositoryImpl(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@Override
public void updateNonNull(MyDomain myDomain) {
//Populate the fileds you want to patch
Update update = Update.update("key1", "value1")
.update("key2", "value2");
// you can you Update.fromDocument(Document object, String... exclude) to
// create you document as well but then you need to make use of `MongoConverter`
//to convert your domain to document.
// create `queryToMatchId` to mtach the id
mongoTemplate.updateFirst(queryToMatchId, update, MyDomain.class);
}
}
public interface MyDomainRepository extends MongoRepository<..., ...>,
MyDomainRepositoryCustom {
}