如果文档存在,如何进行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文档
要使内部部分原子化,您可以使用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是目前通过重要更新操作执行完全原子更新插入的唯一方法。
| 归档时间: |
|
| 查看次数: |
5454 次 |
| 最近记录: |