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

`r.row` and `r.contains ` in nested queries not working

正在尝试使用另一个 table 中的字段在文档中添加新字段。我首先尝试使用 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 在第一个查询中不起作用?

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

您必须指定 non_atomic 标志,因为您传递给更新的函数不能自动应用(因为它不是确定性的)。按照您编写的方式,它将对原始过滤器中的每一行执行 table 提取。

你可能想写这样的东西:

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