Spring React MongoDB模板使用对象部分更新文档

时间:2018-09-23 07:18:07

标签: mongodb spring-boot spring-data

我有一些要在mongo db中更新的类(文档)

存储在mongo中的文档(实际示例更加复杂):

{
   "id": "5ba6b0576cba836aa43ab379",
   "firstName": "First Name",
   "lastName": "Last Name",
   "mobile": "123456789"
   ....................
   ....................
   ....................
   "address": "some address"
}

比方说,我在上面的所有这些字段中都有Foo类。

我从外部部分对象接收(Foo只有3个值,所有其他值均为空),例如:

{
   "id": "5ba6b0576cba836aa43ab379",
   "mobile": "987654321",
   "address": "other address"
}

我想更新文档,但仅包含接收到的字段。

我发现只有一个选项可以使用reactmongotemplate手动进行。 我正在寻找更多的“不错”的方法,而无需手动创建Update对象。像这样:

reactivemongotemplate.updateFirst(
    Query.query(Criteria.where("id").is("5ba6b0576cba836aa43ab379")), 
    partialFoo // (object of class is Foo)
)

有人知道有什么方法吗?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是“最聪明”的方式,但是对于我正在开始的其他Web服务,我一直在尝试内部简化PATCH和PUT方法,并使用Map来实现。使用org.apache.commons.beanutils.PropertyUtils库,然后创建要传递给ReactiveMongoTemplate的Update对象,或多或少是这样的:

Map<String, Object> changes = PropertyUtils.describe(myDto);
// ... check the fields that must be sets and other business rules ...
Update updateFields = new Update();
for(Map.Entry<String, Object> entry : changes.entrySet()){
  updateFields.set(entry.getKey(), entry.getValue());
}
reactivemongotemplate.updateFirst(query(where("id").is(myId)), updateFields, MyEntity.class)

这意味着您的MyDto类具有您需要的每个字段的getter和setter,但是到目前为止,它运行良好。