RethinkDB:​​如何做真正的upsert - 在更新时插入新文件失败?

La *_*ulx 5 rethinkdb

我想在更新失败时插入新文档 - 有没有办法做到这一点?现在RethinkDB只允许我在插入命令中通过{upsert:true}更新插入失败的文档.

mlu*_*ucy 4

您可以replace与分支和显式合并一起使用。

replace类似于update,只不过它完全替换了文档而不是与其合并。以下是等效的(在 Ruby 代码中):

table.get(id).update{|row| {a: row['a']+1}}
table.get(id).replace{|row| row.merge({a: row['a']+1})}
Run Code Online (Sandbox Code Playgroud)

因此,如果您想要执行“更新”,或者在没有行的情况下插入一行,您可以这样做:

table.get(id).replace {|row|
  r.branch(
    row.eq(nil),
    INSERT_OBJECT,
    row.merge(UPDATE_OBJECT))
}
Run Code Online (Sandbox Code Playgroud)