给定表checkpointAttempts,使用模式:
{
id: primary_key,
userId: secondary_key & index,
checkpointId: secondary_key & index
}我试图在运行时找到与userIds数组和checkpointIds数组匹配的所有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。
对于我做错了什么,或者如何以不同的方式构造这个查询,有什么建议吗?
谢谢!
发布于 2016-01-09 03:08:34
不能在筛选器函数中使用原始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)
})https://stackoverflow.com/questions/34689059
复制相似问题