Mongo返回从3个发现中找到的第一组结果()

时间:2015-04-24 19:10:58

标签: mongodb 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"]}
},
{
    "geoTargets.countries.name": {$in: ["US"]},
    "geoTargets.countries.regions.name": {$in: ["NY", "NJ"]}
},
{
    "geoTargets.countries.name": {$in: ["US"]}
}

我正在尝试搜索,我想这样做:

  1. 首先尝试查找与其中一个城市匹配的结果
  2. 如果找不到任何内容,请尝试查找与其中一个区域匹配的结果
  3. 如果找不到任何内容,请尝试查找仅与国家相匹配的结果
  4. 在我的应用程序中,我正在进行搜索:

    采用这个精简版节点(不是真实的,只是为了可视化),这是我基本上搜索的方式。它似乎不是最好的。看起来这会很慢。 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);
    

2 个答案:

答案 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/