branch
の条件に基づいて配列フィールドに簡単なupsertを実行しようとしています。しかしbranch
は引数としてreql式を受け入れず、エラーExpected type SELECTION but found DATUM
が出ます。RethinkDB内のブランチで項目を条件付きで更新する方法
これはおそらく私が逃したいくつかの明白なことですが、どこでも実際の例は見つかりません。
サンプルソース:
var userId = 'userId';
var itemId = 'itemId';
r.db('db').table('items').get(itemId).do(function(item) {
return item('elements').default([]).contains(function (element) {
return element('userId').eq(userId);
}).branch(
r.expr("Element already exist"),
//Error: Expected type SELECTION but found DATUM
item.update({
elements: item('elements').default([]).append({
userId: 'userId'
})
})
)
})
Big thanks @ sam-hughes。そのような取引が最適なやり方でできるかどうかは疑問です。私が達成した限りでは、2つの別個の非原子的な要求を行うか、常に更新を実行する必要があります。 – xb1itz
@ xb1itz - 更新は最適な方法で行います。更新によって同じ文書が返された場合は変更されず、何も書き込まれません。 RethinkDBは、具体的には、新しいバージョンのドキュメントと古いバージョンを比較します。もしあなたがそれについて緊張しているなら、あなたはr.errorを使ってアップデートを中止することもできると思います。 –