Массовое обновление в RethinkDB
Я пытаюсь обновить несколько документов в RethinkDB, основываясь на некоторых предварительно вычисленных значениях в хэше. т.е.
Учитывая стол stats
с первичным ключом slug
с данными как
[{slug: 'foo', stats: {}}, {slug:'bar', stats:{}}]
и дан хэш с такими значениями, как
updated_stats = {
'foo' => {a: 1, b: 2},
'bar' => {a: 3, b: 4}
}
я могу сделать это
updated_stats.each{|k,v|
r.table('stats').get(k).update{|s|
{ :stats => v }
}
}
Итак, почему я не могу сделать следующее?
r.table('stats').get_all(*updated_stats.keys).update{|s|
{ :stats => updated_stats[s["slug"]] }
}
rql показывает nil как значение updated_stats[s["slug"]]. Буду очень признателен за любую помощь в этом. Благодарю.
2 ответа
Это сложная проблема.
Вот решение в первую очередь.
r.table('stats').get_all(*updated_stats.keys).update{|s|
{ :stats => r.expr(updated_stats).get_field(s["slug"]) }
}.run()
затем updated_stats
это рубиновый хеш, так что когда вы используете скобки, это обычный оператор скобки, и так как updated_stats
не имеет ключа s["slug"], он возвращает ноль. Так что вы должны обернуть updated_stats
в r.expr()
,
Затем скобки в рубине используются для nth
, get_field
, slice
и т. д. И когда ему дают переменную, она не может угадать, какую из них использовать. Таким образом, вы должны явно сказать, что вы хотите использовать get_field
, Мы добавим скобочный термин, который должен решить эту проблему - см. https://github.com/rethinkdb/rethinkdb/issues/1179
Извините, что столкнулись с этим!
Для тех, кто ищет массовое обновление записей, на самом деле это довольно просто, но совсем не интуитивно понятно.
Вы на самом деле должны выполнить insert
указав, что если есть какие-либо конфликты, чтобы обновить эти записи. Вам, очевидно, нужно будет указать идентификатор каждой записи, которая будет обновлена.
Используя следующий набор данных:
|-------------|--------------|
| id | title |
|-------------|--------------|
| 1 | fun |
|-------------|--------------|
| 2 | in |
|-------------|--------------|
| 3 | the |
|-------------|--------------|
| 4 | sun |
|-------------|--------------|
Вот пример (javascript):
const new_data = [
{id: 1, title: 'dancing'},
{id: 4, title: 'rain'},
];
r.db('your_db').table('your_table').insert(new_data, {conflict: 'update'});
Результаты будут:
|-------------|--------------|
| id | title |
|-------------|--------------|
| 1 | dancing |
|-------------|--------------|
| 2 | in |
|-------------|--------------|
| 3 | the |
|-------------|--------------|
| 4 | rain |
|-------------|--------------|
Однако следует помнить, что если вы представляете что-то в new_data
Массив, которого в данный момент нет в таблице, он будет добавлен / добавлен.
Ура!