Массовое обновление в 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 Массив, которого в данный момент нет в таблице, он будет добавлен / добавлен.

Ура!

Другие вопросы по тегам