2017-10-17 72 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)表達式。該選項的問題是行爲不是原子的 - 兩個不同的查詢可能會將相同的元素添加到「元素」數組中。相反,您應該以r.db('db').table('items').get(itemId).update(function(item) { return <something>;)的形式編寫查詢,以便更新以原子方式應用。

+0

非常感謝@ sam-hughes。我仍然懷疑這樣的交易是否可以以最佳方式完成。據我所知 - 它需要做兩個截然不同的非原子請求或總是進行更新。 – xb1itz

+0

@ xb1itz - 更新將以最佳方式進行。如果更新返回相同的文檔,保持不變,則不會寫入任何內容。 RethinkDB專門將新版本的文檔與舊版本進行比較。如果你對此感到緊張,我想你也可以使用r.error來中止更新。 –

相關問題