cassandra - 使用 cassandra 反应式存储库在 db 上进行的一组更改
问题描述
我正在尝试使用 projectreactor 和 ReactiveCassandraRepository 在 2 个 cassandra 表上做一些混合逻辑。表看起来像这样:
1) 用户 ID (pk) | hashId
2) hashIf (pk) | 用户身份
当我获得新的 userId 时,我需要使用 spring 数据在两个表中更改该值。我尝试这样做:
fun change(userId: String, oldUserId: String) {
userIdToHashRepository
.findAllByUserId(oldUserId)
.flatMap { response ->
// response is object like Check(val userId: String, val hash: String)
userIdToHashRepository.saveUserIdAndHash(
userId,
response.hash
)
hashToUserIdRepository.updateUserIdByHash(
userId,
response.hash
)
}
.doOnNext {
userIdToHashRepository.deleteAllByUserId(oldUserId.toString())
}
.subscribe()
}
当我从表中的值开始时:
1) userId | hashId
111 111111
2) hashId | userId
111111 111
和newUserId=444
我明白了:
1)
userId | hashId
111 111111
(没有附加行,也没有删除旧行,这很可悲)
2) hashId | userId
111111 444
111111 111
(行是附加的,但我想删除旧行)
那么请你说,为什么只有 flatMap 之后的第二种方法有效?为什么 doOnNext 不起作用?
以及如何解决这个问题?
谢谢!
解决方案
如果你做这样的事情怎么办?您应该始终链接调用。
fun change(userId: String, oldUserId: String) {
userIdToHashRepository
.findAllByUserId(oldUserId)
.flatMap ( response ->
// response is object like Check(val userId: String, val hash: String)
userIdToHashRepository.saveUserIdAndHash(
userId,
response.hash
)}
.flatMap( response -> hashToUserIdRepository.updateUserIdByHash(
userId,
response.hash
)
.doOnNext {
userIdToHashRepository.deleteAllByUserId(oldUserId.toString())
}
.subscribe()
}
推荐阅读
- laravel - Laravel Eloquent orWhere 没有按预期工作
- angular - Angular - 延迟加载 2 个模块并需要共享相同的服务
- containers - 在 AWS ECS 中,服务之间如何通信?(协议,最佳实践)
- python - 如何函数调用同一类python中的另一个函数
- python - 使用 If 和 Elif 修复
- javascript - 如何拆分 0 天 15 小时 1 分钟 0 秒并将其分配到 java 脚本中的不同变量中?
- language-agnostic - 如何找到从一点到地球表面路径的最短距离
- angular - Angular 表单组在提交时未返回
- ocaml - OCaml:此表达式的类型为 int,但表达式应为 MyFoo.ty 类型(MyFoo.ty 为 int 除外)
- javascript - 在不影响没有 iframe id 的父页面的情况下刷新 iframe