2016-02-15 72 views
0

如何在RethinkDB中執行原子upsert?例如,包含網址(id)和點擊次數(次數)的表格。據我應該使用{衝突:「更新」}文檔,所以我嘗試了以下內容:RethinkDB原子upsert

r.db('test').table('urls').insert({ 
    id: 'google.com', 
    count: r.row('count').add(1).default(1), 
    // ... lots of other fields ... 
}, { 
    conflict: 'update' 
}); 

這將返回錯誤r.row is not defined in this context。我在他們的github回購中發現了一個問題,danielmewes建議使用.get(...).replace(...)來達到這個目的,但是如果替換整個文檔來更新一個字段不是很昂貴嗎?如果它不存在,我可以使用get,然後使用updateinsert,但這可能會導致競爭條件,因爲會有多個進程寫入此表。謝謝您的幫助!

回答

1

是的,要做到這一點的方法是用replace來處理文檔不存在的情況。 RethinkDB總是在你更新一個字段時重寫整個文檔,所以你不應該擔心replace由於這個原因而導致性能更差。