Я знаю rethinkDB's insert() имеет опцию upsert. Например, из документации:RethinkDB: условный upsert (только если определенные поля совпадают)?
rethinkdb.table('marvel').insert(
{ superhero: 'Iron Man', superpower: 'Arc Reactor' },
{upsert: true, return_vals: true}
).run(conn, callback)
Но говорят, что может быть существующим рекорд {superhero: 'Iron Man'}
с неправильным или устаревшей сверхдержавой, и я хотел либо вставить { superhero: 'Iron Man', superpower: 'Arc Reactor' }
или обновить существующую {superhero: 'Iron Man'}
записи?
Вкратце: как можно обновить, чтобы существующие записи обновлялись, только если определенные поля совпадают?
Edit: Похоже, это делается с .Привернуть():
Вот the important bit from the replace() docs:
Вы можете иметь новые документы, вставленной если вы точечно заменить на ключевой что ISN 't в таблице
Я не уверен, что означает «точка-замена», но я предполагаю, что это просто означает заменить.
var latestDoc = { superhero: 'Iron Man', superpower: 'Arc Reactor' }
var mergeOrCreate = function(existingDoc) {
if (existingDoc) {
return existingDoc.merge(latestDoc)
} else {
return latestDoc
}
}
rethinkdb.table('marvel')
.filter({ superhero: 'Iron Man'})
.replace(mergeOrCreate),
).run(conn, callback)
Однако в тестировании, функция «» mergeOrCreate уделяется другую функцию, а не фактический документ или курсор, в качестве аргумента.
Спасибо! Не возражаете, если я задам вам пару вопросов? Должны ли условные upserts всегда выполняться с опцией insert & upsert? – mikemaccana
Также что означает «point-replace» в документах replace()? – mikemaccana
Нет, как вы заметили, заменить тоже можно. Точкой замены является замена после get. – AtnNn