mongodb - Spring响应式mongodb模板部分使用对象更新文档

标签 mongodb spring-boot spring-data

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

mongo中存储的文档(真实例子比较复杂):

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

比方说,我的 Foo 类包含上述所有这些字段。

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

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

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

我发现唯一的选择是使用reactivemongotemplate手动执行此操作。 我正在寻找更“好”的方式,而无需手动创建更新对象。像这样的东西:

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

有人知道有什么方法可以做到这一点吗?

最佳答案

我不知道这是否是“最好的”方法,但是对于我正在开始的休息网络服务,我一直在尝试在内部简化 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,但到目前为止它运行得很好。

关于mongodb - Spring响应式mongodb模板部分使用对象更新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463918/

相关文章:

c# - ReplaceOne 方法的过滤器匹配文档,不执行替换

java - Spring Boot Amazon AWS S3 存储桶文件下载 - 访问被拒绝

java - 如何在 Spring Boot 中仅记录错误

mongodb - 如何将运行选项传递给 docker-compose

mongodb - 无法在 Mongodb Atlas 端口上连接

node.js - 通过 Mongoose 更新多个子文档?

java - Spring Cloud java.lang.IllegalStateException : Cannot load environment

mongodb - Spring Data MongoDB 查找查询不返回任何结果

java - 将 Iterable 转换为 Collection 的简单方法

spring-security - 带有 spring-security AuditorAware 的 spring-data-jpa 应用程序中的 StackOverflowException