如何在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
后跟update
或insert
,如果它不存在,但这可能会导致竞争条件,因为会有多个进程写入此表。谢谢你的帮助!
答案 0 :(得分:1)
是的,这样做的方法是使用replace
来处理文档不存在的情况。 RethinkDB会在您立即更新字段时重写整个文档,因此您不必担心replace
因此导致性能下降。