我正在尝试根据哈希中的一些预先计算的值更新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”]]的值。真的很感激任何帮助。感谢。
答案 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中的括号用于nth
,get_field
,slice
等。当给定变量时,它无法猜出应该使用哪一个。
因此,您必须明确表示要使用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
数组中表示某个内容,则它将被添加/添加
干杯!