2017-10-17 10 views
0

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' 
     }) 
    }) 
) 
}) 

答えて

1

ここでの問題は、itemはデータム、ない選択であるということです。これは、r.doを使用したために発生します。変数は、オブジェクトが元々どこから来たのかに関する情報を保持しません。

解決策は、新しいr.db('db').table('items').get(itemId)という表現を書くことです。そのオプションの問題は、動作がアトミックではないことです.2つの異なるクエリが同じ要素を 'elements'配列に追加する可能性があります。代わりに、r.db('db').table('items').get(itemId).update(function(item) { return <something>;)の形式でクエリを記述して、更新がアトミックに適用されるようにする必要があります。

+0

Big thanks @ sam-hughes。そのような取引が最適なやり方でできるかどうかは疑問です。私が達成した限りでは、2つの別個の非原子的な要求を行うか、常に更新を実行する必要があります。 – xb1itz

+0

@ xb1itz - 更新は最適な方法で行います。更新によって同じ文書が返された場合は変更されず、何も書き込まれません。 RethinkDBは、具体的には、新しいバージョンのドキュメントと古いバージョンを比較します。もしあなたがそれについて緊張しているなら、あなたはr.errorを使ってアップデートを中止することもできると思います。 –

関連する問題