Я пытаюсь сделать следующее:
- Проверьте, существует ли запись с критериями фильтра
- Если это так, ничего не делайте
- Если это не так, создайте его с некоторыми настройками по умолчанию.
Теперь я мог бы сделать это с помощью 2 запросов:
function ensureDocumentExists(connection, criteria, defaults) {
return r.table('tbl')
.filter(criteria)
.coerceTo('array') // please correct me if there's a better way
.run(connection)
.then(([record]) => {
if (record) {
return Promise.resolve() // Record exists, we are good
} else {
return r.table('tbl') // Record is not there we create it
.insert(defaults)
.run(connection)
}
})
}
Но тот факт, что r.branch
и r.replace
существуют, подсказывает мне, что это возможно за один прогон. Это? Я думал примерно так:
function ensureDocumentExists(connection, criteria, defaults) {
return r.table('tbl')
.filter(criteria)
.replace(doc => r.branch(
r.exists(doc), // If doc exists (I'm just making this up)
doc, // Don't touch it
defaults // Else create defaults
)).run(connection)
}
Но я не уверен, что замена является правильным методом для этого, а также не знаю, как проверить, существует ли данная строка.