Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringData Mongo投影忽略并覆盖保存时的值_Spring_Mongodb_Spring Boot_Spring Data - Fatal编程技术网

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

让我解释一下SpringData mongo的问题,我声明了以下接口,我声明了一个自定义查询,使用一个投影来忽略索引,这个示例仅用于说明,在现实生活中我将忽略一组字段

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数据存储库提供的扩展来定义自定义存储库方法

公共接口MyDomainRepository扩展了MongoRepository, MyDomainRepositoryCustom{ }
{
    "_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 {
    }