如何在RethinkDB中使用不仅仅是主键的原子更新



我有一个名为Wallet的表,它可以被认为是用户平衡。每个用户有一个文档,所以我制作了主键userId,还有一个存储用户余额的balance字段。我最初的想法是,在更改用户平衡之前,我需要能够从DB中提取文档,并在应用程序层进行某些检查,所以这排除了.get(id).update(...),我知道它是原子的。

相反,我添加了一个名为lock的属性,它是一个字符串。应用程序必须首先.get(id).update({ lock: reallylongstring }),然后当应用程序准备好提交更改时,他们必须将该锁传回,理想情况下,如果锁错误(意味着其他人进来并在之后获得了锁),Rethink将拒绝任何更改。

如果这是mongo,我会做一些类似的事情:

this.findOneAndUpdate({
  _id: id,
  lock: lock
}, {
  ...
})

然后,任何锁定错误的更新都会失败,因为找不到文档。在"反思"中,最好的方法是什么?或者我的方法完全是错误的,还有什么更好的方法呢?

您可以在update:中放入branch

.get(id).update(function(row) {
  return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})

EDIT:删除了不正确的选项。

相关内容

最新更新