嵌套查询中的`r.row`和`r.contains`不起作用

时间:2016-06-27 16:58:38

标签: rethinkdb

尝试使用另一个表中的字段在文档中添加新字段。我首先尝试使用r.row

r.db('client').table('basic_info').filter({name:'Andre Pastr'}).update({teacher_name: r.db('teacher').table('basic_info').contains(r.row('name').eq('Nicholas Derma')).pluck('id')});

并返回消息:

e: Cannot use r.row in nested queries.  Use functions instead in:
r.db("client").table("basic_info").filter({name: 'Andre Pastr'}).update({"teacher_name": r.db("teacher").table("basic_info").contains(r.row("name").eq("Nicholas Derma")).pluck("id")})
                                                                                                        ^^^^^                                               

然后在github问题日志中找到[模糊条目] [1]后,我决定只更改查询的语法并运行:

r.db('client').table('basic_info').filter({name:'Andre Albuquerque'}).update({teacher_name: r.db('teacher').table('basic_info').filter({name: 'Nicholas Chadwick'}).pluck('id')});

返回错误消息:

: Could not prove argument deterministic.  Maybe you want to use the non_atomic flag?

三个相互关联的问题:我如何使用contains来运行这样的查询?我在第二次查询时做错了什么?为什么r.row在第一个查询中不起作用?

1 个答案:

答案 0 :(得分:1)

您无法在第一个查询中使用r.row,因为它是否应绑定到containsupdate是不明确的。 (我们可以定义它绑定哪一个,但它对人们来说非常混乱,因为大多数人都没有记住可能绑定r.row的所有术语,所以强迫人们在模糊的情况下命名他们的变量更容易。 )

您必须指定non_atomic标志,因为您传递给更新的函数不能以原子方式应用(因为它不是确定性的)。你编写它的方式是,它将为原始过滤器中的每一行执行一次表获取。

你可能想写这样的东西:

r.table('basic_info').filter({name: 'Nicholas Derma'}).pluck('id').do(function(nderma) {
  return r.table('basic_info').filter({name: 'Andre Pastr'}).update({teacher_name: nderma);
})

如果您经常运行此查询,则应考虑在name上创建二级索引并使用getAll而不是filter