2016-02-15 3 views
0

Как я могу выполнить атомный upsert в RethinkDB? Например, таблица с URL-адресами (id) и количеством кликов (количество). Согласно документации, которую я должен использовать {конфликт: «обновление»}, поэтому я попытался следующее:RethinkDB atomic 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, а затем update или insert, если он не существует, но это может привести к состоянию гонки, так как в этой таблице будет много процессов. Спасибо за помощь!

ответ

1

Да, способ сделать это с помощью replace, который обрабатывает случай, когда документ не существует. RethinkDB всегда переписывает весь документ при обновлении поля прямо сейчас, поэтому вам не стоит беспокоиться о replace, имея худшую производительность по этой причине.

Смежные вопросы