我有没有办法搜索选项列表,直到其中一个选项返回结果?或者通常有更好的方法来查找具有以下三个查询的记录:
{
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]},
"geoTargets.countries.regions.cities.name": {$in: ["City 1", "City 2", "City 3"]}
},
{
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]}
},
{
"geoTargets.countries.name": {$in: ["US"]}
}
我正在尝试搜索,我想这样做:
在我的应用程序中,我正在进行搜索:
采用这个精简版节点(不是真实的,只是为了可视化),这是我基本上搜索的方式。它似乎不是最好的。看起来这会很慢。 MongoDB中有一种方法可以将其作为一个查询吗?
var results = db.campaigns.find({
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]},
"geoTargets.countries.regions.cities.name": {$in: ["City 1", "City 2", "City 3"]}});
if(results.length == 0){
results = db.campaigns.find({
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]}});
if(results.length == 0){
results = db.campaigns.find({"geoTargets.countries.name": {$in: ["US"]}});
}
}
console.log(results);
答案 0 :(得分:2)
您可以利用$or运算符将这些条件联合起来并执行它们。
聚合框架的布尔$or
运算符执行short circuit
求值,即,如果满足前面的条件,则不对文档执行其余条件。
var condA = {
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]},
"geoTargets.countries.regions.cities.name": {$in: ["City 1", "City 2", "City 3"]}
};
var condB = {
"geoTargets.countries.name": {$in: ["US"]},
"geoTargets.countries.regions.name": {$in: ["NY", "NJ"]}
};
var condC = {
"geoTargets.countries.name": {$in: ["US"]}
};
并将其执行为:
db.campaigns.aggregate(
[
{$match:{$or:[condA,condB,condC]}}
],function(err,data){
//callback
})
$或使用短路逻辑:操作后停止评估 遇到第一个真实的表达。
虽然$or
运算符在find()
查询中用作查询运算符时未记录此行为,但您也可以尝试使用它,并查看哪一个对您的数据集更有效。
答案 1 :(得分:0)
使用逻辑查询运算符:http://docs.mongodb.org/manual/reference/operator/query-logical/ 要获得与查询条件匹配的文档计数,还要包括$ match阶段:
db.collection.aggregate(
[
{ $match: <query condition> },
{ $group: { _id: null, count: { $sum: 1 } } }
]
)
文档:http://docs.mongodb.org/manual/reference/method/db.collection.count/