Mongodb SpringBoot反应MongoTemplate部分更新文档

Mongodb SpringBoot反应MongoTemplate部分更新文档,mongodb,kotlin,spring-data,reactor,Mongodb,Kotlin,Spring Data,Reactor,我正在从事kotlin反应式spring boot mongodb项目。我正在尝试更新文档,但效果不好 我的问题与stackoverflow中的以下问题非常相似 所以我在mongo有一份文件 { "id": 1, "name": "MYNAME", "email": "MYEMAIL", "encryptedPassword": "12345", ........................... } 当我在urilocalhost:8080/user/1上使用以下标

我正在从事kotlin反应式spring boot mongodb项目。我正在尝试更新文档,但效果不好

我的问题与stackoverflow中的以下问题非常相似

所以我在mongo有一份文件

{
  "id": 1,
  "name": "MYNAME",
  "email": "MYEMAIL",
  "encryptedPassword": "12345",
  ...........................
}
当我在uri
localhost:8080/user/1
上使用以下标题之一调用补丁时

{
  "name": "NEW NAME"
}
我只想用收到的字段更新我的文档

我的处理程序代码

fun update(serverRequest: ServerRequest) =
        userService
                .updateUser(serverRequest.pathVariable("id").toLong(), serverRequest.bodyToMono())
                .flatMap {
                    ok().build()
                }
我的服务实现代码

override fun updateUser(id: Long, request: Mono<User>): Mono<UpdateResult> {
    val changes = request.map { it -> PropertyUtils.describe(it) }
    val updateFields: Update = Update()
    changes.subscribe {
        for (entry in it.entries) {
            updateFields.set(entry.key, entry.value)
        }
    }
    return userRepository.updateById(id, updateFields)
}
我的用户代码

@Document
data class User(
        @Id
        val id: Long = 0,
        var name: String = "",
        val email: String = "",
        val encryptedPassword: ""
)
我听从了他们的建议

我的代码会更新,但它会更新到我的
用户
类的初始构造函数


可以帮助这个吗?

< P>我想你应该把这个问题当作是用java/KOTLIN修补对象的一般问题。我发现了一篇关于此的文章:。即使你不更新一个对象,也不会对应用程序的性能造成如此大的影响。

< P>我想你应该把这个问题当作是用java/KOTLIN修补对象的一般问题。我发现了一篇关于此的文章:。即使不部分更新对象,也不会对应用程序的性能造成太大影响。

我找到了部分更新数据的方法

首先,我将body请求更改为string。(使用
bodytomino(String::class.java

然后我将更改后的JSON字符串更改为JSONObject(
org.JSON

对于其
JSONObject
的每个键,我创建了
Update
,这将是更新实体的部分数据

下面是我如何实现的

override fun updateUser(id: Long, request: Mono<String>): Mono<UpdateResult> {
    val update = Update()
    return request.map { JSONObject(it) }
            .map {
                it.keys().forEach { key -> update.set(key, it[key]) }
                update
            }
            .flatMap { it -> userRepository.updateById(id, it) }

}
override-fun-updateUser(id:Long,request:Mono):Mono{
val update=update()
return request.map{JSONObject(it)}
.地图{
it.keys().forEach{key->update.set(key,it[key])}
更新
}
.flatMap{it->userRepository.updateById(id,it)}
}

如果你有更“干净”的方法,请分享更多想法。谢谢你。

我知道了如何部分更新我的数据

首先,我将body请求更改为string(使用
bodytomino(string::class.java

然后我将更改后的JSON字符串更改为JSONObject(
org.JSON

对于其
JSONObject
的每个键,我创建了
Update
,这将是更新实体的部分数据

下面是我如何实现的

override fun updateUser(id: Long, request: Mono<String>): Mono<UpdateResult> {
    val update = Update()
    return request.map { JSONObject(it) }
            .map {
                it.keys().forEach { key -> update.set(key, it[key]) }
                update
            }
            .flatMap { it -> userRepository.updateById(id, it) }

}
override-fun-updateUser(id:Long,request:Mono):Mono{
val update=update()
return request.map{JSONObject(it)}
.地图{
it.keys().forEach{key->update.set(key,it[key])}
更新
}
.flatMap{it->userRepository.updateById(id,it)}
}
如果你有更“干净”的方法,请分享更多想法。谢谢

override fun updateUser(id: Long, request: Mono<String>): Mono<UpdateResult> {
    val update = Update()
    return request.map { JSONObject(it) }
            .map {
                it.keys().forEach { key -> update.set(key, it[key]) }
                update
            }
            .flatMap { it -> userRepository.updateById(id, it) }

}