多个值的 Rethinkdb 谓词函数 'contains' 不起作用
Rethinkdb predicate function 'contains' for multiple values not working
我的数据模式如下所示:
{
"datetime": "1453845345493",
"someIds": ["id2000-4", "id1000-34"]
}
其中数组 someIds
可以包含许多不同的值。
使用以下查询基于一个 ID 进行过滤没有问题,return 大约有 400 个结果。 (我还计划实施适当的索引,但目前正在测试一个更简单的案例。)
r.db("dbName").table("tableName")
.filter(r.row("datetime").gt(1453845340493))
.filter(function(someVal){
return someVal("someIds").contains("id2000-4");
})
.count()
但尝试遵循最后一个示例 in the 'contains' documentation,它建议使用谓词函数来模拟 'or' 语句 return 没什么,而应该 return以上的超集:
r.db("dbName").table("tableName")
.filter(r.row("datetime").gt(1453845340493))
.filter(function(someVal){
return r.expr(["id2000-4", "id1000-77"]).contains(someVal("someIds"));
})
.count()
据我所知,我已完全按照该页面上的说明进行操作,但它不起作用。我是 运行 RethinkDB v2.2.3-1,并且是 运行 数据资源管理器中的这个。有什么建议吗?
该页面上的示例正在调用 r.expr(ARRAY).contains(SINGLE_VAL)
,而您的代码正在调用 r.expr(ARRAY).contains(OTHER_ARRAY)
。如果你想检查 someIds
是否包含数组中的任何元素,我会使用 https://www.rethinkdb.com/api/javascript/set_intersection/ 。 (所以类似于 .filter(function(someVal) { return r.expr(ARRAY).setIntersection(someVal('someIds')).count().ne(0); })
。)
如果你想用contains
来做,你可以这样写:
.filter(function(someVal) {
return someVal('someIds').contains(function(someId) {
return r.expr(ARRAY).contains(someId);
});
})
我的数据模式如下所示:
{
"datetime": "1453845345493",
"someIds": ["id2000-4", "id1000-34"]
}
其中数组 someIds
可以包含许多不同的值。
使用以下查询基于一个 ID 进行过滤没有问题,return 大约有 400 个结果。 (我还计划实施适当的索引,但目前正在测试一个更简单的案例。)
r.db("dbName").table("tableName")
.filter(r.row("datetime").gt(1453845340493))
.filter(function(someVal){
return someVal("someIds").contains("id2000-4");
})
.count()
但尝试遵循最后一个示例 in the 'contains' documentation,它建议使用谓词函数来模拟 'or' 语句 return 没什么,而应该 return以上的超集:
r.db("dbName").table("tableName")
.filter(r.row("datetime").gt(1453845340493))
.filter(function(someVal){
return r.expr(["id2000-4", "id1000-77"]).contains(someVal("someIds"));
})
.count()
据我所知,我已完全按照该页面上的说明进行操作,但它不起作用。我是 运行 RethinkDB v2.2.3-1,并且是 运行 数据资源管理器中的这个。有什么建议吗?
该页面上的示例正在调用 r.expr(ARRAY).contains(SINGLE_VAL)
,而您的代码正在调用 r.expr(ARRAY).contains(OTHER_ARRAY)
。如果你想检查 someIds
是否包含数组中的任何元素,我会使用 https://www.rethinkdb.com/api/javascript/set_intersection/ 。 (所以类似于 .filter(function(someVal) { return r.expr(ARRAY).setIntersection(someVal('someIds')).count().ne(0); })
。)
如果你想用contains
来做,你可以这样写:
.filter(function(someVal) {
return someVal('someIds').contains(function(someId) {
return r.expr(ARRAY).contains(someId);
});
})