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

时间:2016-01-09 02:23:56

标签: rethinkdb rethinkdb-javascript

给定表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的谓词函数似乎总是返回false。

关于我做错了什么,或者我如何以不同方式构建此查询的任何建议?

谢谢!

1 个答案:

答案 0 :(得分:1)

您无法在过滤器功能中使用indexOf等原始JavaScript。您必须使用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)
  })

只想在这里发布一些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)
})