给定表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。
关于我做错了什么,或者我如何以不同方式构建此查询的任何建议?
谢谢!
答案 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)
})