过滤 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)
})
给定 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)
})