过滤 RethinkDB ReQL 中两个数组的命中?

Filter for hits on two arrays in RethinkDB ReQL?

给定 table checkpointAttempts,架构:

{ 
  id: primary_key,
  userId: secondary_key & index,
  checkpointId: secondary_key & index
}

我试图找到所有 checkpointAttempts 在运行时匹配 userIds 数组和 checkpointIds 数组。

我认为这样做可能有效:

// var userIds and checkpointIds are defined arrays & in scope

var q = r.table("checkpointAttempts");
q = q.getAll.apply(q, userIds.concat({index: userId}))
  .filter(function(attempt){
    return checkpointIds.indexOf(attempt('checkpointId')) !== -1
  })
  .run(conn)

但是,filter 的谓词函数似乎总是 return false。

关于我做错了什么,或者我如何以不同的方式构造这个查询有什么建议吗?

谢谢!

您不能在过滤器函数中使用原始 JavaScript,例如 indexOf。你必须使用 ReQL 表达式和函数。

getAll 上,您可以简单地用 args 包装所有参数,并消除 apply 将参数作为数组传递的需要。

正确的查询是这样的:

r.table('checkpointAttempts')
  .getAll(r.args(userIds), {index: 'userId'})
  .filter(function(attempt){
    return r.expr(checkpointIds).contains(attempt('checkpointId')).eq(true)
  })

这里只是想post一些JS代码来帮助你搞清楚:

var r = require('rethinkdb')

userIds = [1,2]
checkpointIds = [14, 12]

r.connect().then(function(conn) {
  return r.table('checkpointAttempts')
  .getAll(r.args(userIds),{index: 'userId'})
  .filter(function(attempt){
    return r.expr(checkpointIds).contains(attempt('checkpointId')).eq(true)
  })
  .run(conn)
})
.then(function(cursor) {
  return cursor.toArray()
})
.then(function(d) {
  console.log(d)
})