RethinkDB中的批量更新

时间:2014-01-31 19:32:57

标签: 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 个答案:

答案 0 :(得分:5)

这是一个棘手的问题。

首先是解决方案。

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

然后updated_stats是一个ruby哈希,所以当你使用括号时,它是通常的括号运算符,并且由于updated_stats没有键s [“slug”],它返回nil。 所以你必须在updated_stats中包装r.expr()

然后,ruby中的括号用于nthget_fieldslice等。当给定变量时,它无法猜出应该使用哪一个。 因此,您必须明确表示要使用get_field。 我们将添加一个括号术语,以解决此问题 - 请参阅https://github.com/rethinkdb/rethinkdb/issues/1179

对不起你碰到了这个!

答案 1 :(得分:0)

对于任何想批量更新记录的人来说,这实际上很简单,但一点都不直观。

实际上,您必须执行insert,同时指定是否存在冲突以更新这些记录。显然,您将需要提供要更新的每个记录的ID。

使用以下数据集:

|-------------|--------------|
|      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数组中表示某个内容,则它将被添加/添加

干杯!