如果文档存在,如何进行rethinkdb原子更新,否则插入?

Rob*_*mba 12 rethinkdb

如果文档存在,如何进行rethinkdb原子更新,否则插入?

我想做的事情如下:

var tab = r.db('agflow').table('test');
r.expr([{id: 1, n: 0, x: 11}, {id: 2, n: 0, x: 12}]).forEach(function(row){
  var _id = row('id');
  return r.branch(
    tab.get(_id).eq(null),  // 1
    tab.insert(row),        // 2 
    tab.get(_id).update(function(row2){return {n: row2('n').add(row('n'))}}) // 3
  )})
Run Code Online (Sandbox Code Playgroud)

然而,这不是完全原子的,因为在我们检查文档是否存在(1)和插入它(2)之间,某些其他线程可能会插入它.

如何使这个查询原子?

wed*_*oft 18

我认为解决方案正在通过

conflict="update"
Run Code Online (Sandbox Code Playgroud)

到插入方法.

Als 在插入时看到RethinkDB文档


Dan*_*wes 3

要使内部部分原子化,您可以使用replace

tab.get(_id).replace(function(row2){
  return r.expr({id: _id, n: row2('n').add(row('n'))})
          .default(row)
})
Run Code Online (Sandbox Code Playgroud)

使用replace是目前通过重要更新操作执行完全原子更新插入的唯一方法。