0

给定表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。

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

谢谢!

4

1 回答 1

1

您不能使用原始 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)
  })

只是想在这里发布一些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)
})
于 2016-01-09T03:08:34.607 回答