Bulk Update in RethinkDB

rethinkdb

Solution

It's a tricky problem.

Here's the solution first.

r.table('stats').get_all(*updated_stats.keys).update{|s| 
  { :stats => r.expr(updated_stats).get_field(s["slug"]) } 
}.run()

Then `updated_stats` is a ruby hash so when you use the brackets, it's the usual bracket operator, and since `updated_stats` doesn't have the key s["slug"], it returns nil. So you have to wrap `updated_stats` in `r.expr()`.

Then brackets in ruby are used for `nth`, `get_field`, `slice` etc. And when given a variable, it cannot guess which one it should use. So you have to explicitly say you want to use `get_field`. We will add a bracket term, which should fix this problem -- see https://github.com/rethinkdb/rethinkdb/issues/1179

Sorry you ran into this!

Problem

I'm trying to update multiple documents in RethinkDB, based on some precalculated values in a Hash. i.e. Given a table `stats` with primary key `slug` with data like ``` [{slug: 'foo', stats: {}}, {slug:'bar', stats:{}}] ``` and given a Hash with values like ``` updated_stats = { 'foo' => {a: 1, b: 2}, 'bar' => {a: 3, b: 4} } ``` I can do this ``` updated_stats.each{|k,v| r.table('stats').get(k).update{|s| { :stats => v } } } ``` So, why can't I do the following? ``` r.table('stats').get_all(*updated_stats.keys).update{|s| { :stats => updated_stats[s["slug"]] } } ``` the rql shows nil as the value of updated_stats[s["slug"]]. Would really appreciate any help on this. Thanks.

Original source