要在rethinkdb中过滤掉的子查询

时间:2015-09-25 03:13:57

标签: rethinkdb rethinkdb-python

如何使用Python客户端驱动程序在RethinkDB中编写等效语句?

SELECT id fields FROM tasks WHERE id NOT IN (SELECT id FROM finished_tasks)

这就是我的尝试:

r.table('tasks').filter(lambda row: r.not(row['id'] in r.table('finished_tasks').pluck("id").coerce_to('array').run()

2 个答案:

答案 0 :(得分:0)

在Java Script中:

r.table("tasks").filter(function(task){
 return r.expr(r.table("finished_tasks").pluck("id")).map(function(i){
       return i("id");
    }).coerceTo('array')
      .contains(task("id"))
      .not();

})

在Python中应该是这样的。

答案 1 :(得分:0)

我没有Python的例子。我给出了JavaScript示例,我认为您可以在API doc上进行比较,以编写Python等效文档。

假设id也是finished_tasks表的主键。

r.table('tasks').filter(function(task) {
  return r.table('finished_tasks').get(task('id')).eq(null)
})

如果id不是finished_tasks的主键,请让它为其创建二级索引,然后在getAll

中使用它
// Create index
r.table('finished_tasks').indexCreate('finished_task', r.row('id'))
// Using index for efficient query
r.table('tasks').filter(function(task) {
  return r.table('finished_tasks').getAll(task('id'), {index: 'finished_task'}).count().eq(0)
})