我有一些要在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)
)
有人知道有什么方法吗?
答案 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,但是到目前为止,它运行良好。