RethinkDB原子upsert

时间:2016-02-15 01:09:56

标签: rethinkdb

如何在RethinkDB中执行原子upsert?例如,包含网址(id)和点击次数(计数)的表格。根据文档,我应该使用{conflict:'update'},所以我尝试了以下内容:

r.db('test').table('urls').insert({
  id: 'google.com',
  count: r.row('count').add(1).default(1),
  // ... lots of other fields ...
}, {
  conflict: 'update' 
});

这将返回错误r.row is not defined in this context。我在他们的github回购中看到了一个问题,其中danielmewes建议.get(...).replace(...)以实现这一目标,但更换整个文档以更新字段不是很昂贵吗?我可以使用get后跟updateinsert,如果它不存在,但这可能会导致竞争条件,因为会有多个进程写入此表。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

是的,这样做的方法是使用replace来处理文档不存在的情况。 RethinkDB会在您立即更新字段时重写整个文档,因此您不必担心replace因此导致性能下降。