Rethinkdb原子操作

let*_*4be 5 atomicity rethinkdb

假设我有一份文件

{
    id: 1,
    fruits: []
}
Run Code Online (Sandbox Code Playgroud)

这里的水果充当了SET

现在我想原型地为一个带有主键= 1的文档的fruits数组添加一个值,或者如果它不存在则创建这样的文件(即使用引擎盖下的SetInsert ReQL)

我还需要做同样的增量(ReQL .Add)

显然,这不能在客户端代码中完成,因为它打破了原子性,最终导致数据不一致

我希望这样的事情成为可能

r.table('results').insert({
  id: '62c70132-6516-4279-9803-8daf407ffa5c',
  counter: r.row('counter').add(1).default(0)
}, {conflict: "update"})
Run Code Online (Sandbox Code Playgroud)

但它死于"RqlCompileError:r.row未在此上下文中定义"

任何帮助/指导表示赞赏,谢谢!

Dan*_*wes 7

目前这是不可能insert的.另一个提到的解决方案不是原子的,因为它使用子查询.我们正在https://github.com/rethinkdb/rethinkdb/issues/3753上为此制定解决方案.

但是,您可以使用replace执行原子upsert:

r.table('results').get('62c70132-6516-4279-9803-8daf407ffa5c')
 .replace({
  id: '62c70132-6516-4279-9803-8daf407ffa5c',
  counter: r.row('counter').add(1).default(0)
})
Run Code Online (Sandbox Code Playgroud)

replace 如果文档不存在,将实际执行插入.