如何在 RethinkDB 中使用不仅仅是主键的原子更新?
How to do an atomic update in RethinkDB with more than just the primary key?
我有一个名为 Wallet
的 table,可以将其视为用户余额。每个用户有一个文档,所以我创建了主键 userId
并且有一个 balance
字段用于存储用户余额。我最初的想法是我需要能够从数据库中提取文档并在更改用户余额之前在应用程序层进行某些检查,因此这排除了 .get(id).update(...)
我知道它是原子的。
我所做的是添加一个名为 lock
的 属性,它是一个字符串。应用程序必须首先 .get(id).update({ lock: reallylongstring })
,然后当应用程序准备好提交更改时,他们必须将那个锁传递回去,理想情况下,如果锁是错误的,Rethink 将拒绝任何更改(意味着其他人进来并随后获得了锁) .
如果这是 mongo 我会这样做:
this.findOneAndUpdate({
_id: id,
lock: lock
}, {
...
})
然后任何锁定错误的更新都会失败,因为找不到文档。在 Rethink 中执行此操作的最佳方法是什么?还是我的方法完全错误,什么是更好的方法?
你可以在update
中放一个branch
:
.get(id).update(function(row) {
return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})
编辑:删除了不正确的选项。
我有一个名为 Wallet
的 table,可以将其视为用户余额。每个用户有一个文档,所以我创建了主键 userId
并且有一个 balance
字段用于存储用户余额。我最初的想法是我需要能够从数据库中提取文档并在更改用户余额之前在应用程序层进行某些检查,因此这排除了 .get(id).update(...)
我知道它是原子的。
我所做的是添加一个名为 lock
的 属性,它是一个字符串。应用程序必须首先 .get(id).update({ lock: reallylongstring })
,然后当应用程序准备好提交更改时,他们必须将那个锁传递回去,理想情况下,如果锁是错误的,Rethink 将拒绝任何更改(意味着其他人进来并随后获得了锁) .
如果这是 mongo 我会这样做:
this.findOneAndUpdate({
_id: id,
lock: lock
}, {
...
})
然后任何锁定错误的更新都会失败,因为找不到文档。在 Rethink 中执行此操作的最佳方法是什么?还是我的方法完全错误,什么是更好的方法?
你可以在update
中放一个branch
:
.get(id).update(function(row) {
return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})
编辑:删除了不正确的选项。