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

Mongodb Mongo返回从3个查找()中找到的第一组结果,mongodb,find,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.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"]}
}
我正在尝试搜索,我想这样做:

  • 首先,尝试找到与其中一个城市匹配的结果
  • 如果未找到任何内容,请尝试查找与其中一个区域匹配的结果
  • 同样,如果没有找到任何内容,请尝试查找仅在Courties上匹配的结果
  • 在我的应用程序中,我正在执行类似if的搜索:

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

    使用逻辑查询运算符: 要获取与查询条件匹配的文档计数,还包括$match阶段:

    db.collection.aggregate(
       [
          { $match: <query condition> },
          { $group: { _id: null, count: { $sum: 1 } } }
       ]
    )
    
    db.collection.aggregate(
    [
    {$match:},
    {$group:{{u id:null,计数:{$sum:1}}
    ]
    )
    
    文档:

    您可以利用操作员将这些条件组合在一起并执行它们

    聚合框架的布尔
    $或
    运算符执行
    短路
    求值,即,如果满足上述条件,则不会对文档执行其余条件

    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()
    查询中用作查询运算符时,
    $或
    运算符的这种行为没有记录在案,但您也可以尝试一下,看看哪一种对您的数据集更有效。

    我不是在找计数,而是在找一个文档列表,其中有三个首先返回数据,从第一个开始,如果没有返回结果,请尝试下一个,如果没有返回结果,请尝试第三个。太棒了!我要试试看@Bathscray要使用
    find()
    我必须删除
    $match
    ,因为它给了我一个错误,告诉我
    BadValue未知顶级运算符:$match'
    ,这会做同样的事情吗
    {$or:[citySearch,regionSearch,countrySearch]}
    find()
    似乎比
    aggregate()运行得更快。
    $match
    运算符是聚合管道运算符,不能与
    find()
    查询一起使用。当在find()查询中使用时,文档没有明确提到它是短路运算符。但从逻辑上讲,它应该以同样的方式工作。你可以使用它,它可以给你更好的响应时间。