mongodb - 仅从 Pojo 将非空字段更新到 Mongodb
问题描述
我只想更新 mongo 文档中那些在 POJO 中有值的字段。我该怎么做呢?
我有一个User
包含以下文档的集合:
{
_id: ObjectId("someId"),
name: "Foo",
age: 20,
gender: "male"
}
现在我只想将年龄更新为 22 岁,所以我有一个带有age = 22
and的用户 pojo _id = ObjectId("someId")
。
我不想使用Updates.set("age",22)
,因为那样我将不得不处理每个字段。要填充的字段可能不是age
.
因此,我使用反射制作了一个通用方法来获取Update.sets
pojo的列表
classMembers = User::class.memberProperties
// get hashmap from pojo
val fieldsMap: HashMap<String, Any> =
mapper.convertValue(pojo, object : TypeReference<HashMap<String, Any>>() {}) ?:
throw CustomException( HttpStatus.BAD_REQUEST, "Could not parse request" )
// get hashmap from default/empty pojo
val defaultMap: HashMap<String, Any> =
mapper.convertValue(emptyPojo, object : TypeReference<HashMap<String, Any>>() {}) ?:
throw CustomException( HttpStatus.BAD_REQUEST, "Could not parse request" )
for (member in classMembers) {
val name = member.name
val value = fieldsMap[name]
//add to list only if the current value is not null or default and current value is different
if (value != null && defaultMap[member.name] != value && member.getter.annotations.isNotEmpty()) {
val field = (member.getter.annotations[0] as BsonProperty).value
setList.add(Updates.set(field, value))
}
}
这行得通。但我想知道是否有更好的方法来做到这一点?通过 mongoClient 或 mongoTemplate 或 mongoRepository 执行此操作的默认方法?
解决方案
推荐阅读
- javascript - 试图将 js 变量发送到 php 文件
- python - python请求的等效curl命令是什么?
- bash - sed 删除 # 和 ; 从文件到特定关键字的评论
- java - 无法自动配置数据源:'spring.datasource.url'
- cassandra-3.0 - 在 Cassandra 311 ubuntu 16.04 上找不到 sstabledump
- arrays - 使用区块链为简单数组创建版本控制
- uwp - Microsoft.NETCore.UniversalWindowsPlatform 版本 6.1.2 给出上传错误
- java - 如何在没有未经检查的分配的情况下从通用接口检索对象列表?
- docker - 未找到 cloudera docker 图像
- regex - scala-regexp:将字符串拆分为以下两个单词的数组