首页 > 解决方案 > 仅从 Pojo 将非空字段更新到 Mongodb

问题描述

我只想更新 mongo 文档中那些在 POJO 中有值的字段。我该怎么做呢?

我有一个User包含以下文档的集合:

{
    _id: ObjectId("someId"),
    name: "Foo",
    age: 20,
    gender: "male"

}

现在我只想将年龄更新为 22 岁,所以我有一个带有age = 22and的用户 pojo _id = ObjectId("someId")

我不想使用Updates.set("age",22),因为那样我将不得不处理每个字段。要填充的字段可能不是age.

因此,我使用反射制作了一个通用方法来获取Update.setspojo的列表

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 执行此操作的默认方法?

标签: mongodbspring-bootkotlin

解决方案


推荐阅读