rethinkDB の insert()に upsert オプションがあることは知っています。たとえば、ドキュメントから:
rethinkdb.table('marvel').insert(
{ superhero: 'Iron Man', superpower: 'Arc Reactor' },
{upsert: true, return_vals: true}
).run(conn, callback)
しかし、間違った、または古いスーパーパワーを持つ の既存のレコードが存在する可能性があり、既存のレコードを挿入または更新{superhero: 'Iron Man'}
したいとしますか?{ superhero: 'Iron Man', superpower: 'Arc Reactor' }
{superhero: 'Iron Man'}
要するに、特定のフィールドが一致した場合にのみ既存のレコードが更新されるようにするには、どうすればアップサートできますか?
編集:これは .replace() で行われるようです:
replace() ドキュメントの重要な部分は次のとおりです。
テーブルにないキーでポイント置換を行うと、新しいドキュメントを挿入できます
「ポイント置換」が何を意味するのかはわかりませんが、単に置換を意味すると思います。
var latestDoc = { superhero: 'Iron Man', superpower: 'Arc Reactor' }
var mergeOrCreate = function(existingDoc) {
if ( existingDoc ) {
return existingDoc.merge(latestDoc)
} else {
return latestDoc
}
}
rethinkdb.table('marvel')
.filter({ superhero: 'Iron Man'})
.replace(mergeOrCreate),
).run(conn, callback)
ただし、テストでは、「mergeOrCreate」関数には、実際のドキュメントやカーソルではなく、別の関数が引数として与えられています。