Mongo return 从 3 个 finds() 中找到的第一组结果

Mongo return first set of results found from 3 finds()

有没有一种方法可以让我搜索选项列表,直到其中一个选项返回结果?或者有没有更好的方法来查找包含以下三个查询的记录:

{
    "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. 如果什么都找不到,请再次尝试查找仅在国家/地区匹配的结果

在我的应用程序中,我正在做一个 if like 搜索:

拿这个精简版的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);

使用逻辑查询运算符: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/

您可以使用 $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 uses short-circuit logic: the operation stops evaluation after encountering the first true expression.

虽然在 find() 查询中用作查询运算符时未记录 $or 运算符的这种行为,但您也可以尝试一下,看看哪个对您的数据更有效设置。