将在$ maxDistance和$ and附近使用$ near作为MongoDB中的过滤器吗?

时间:2018-08-08 21:48:19

标签: mongodb geospatial

因此,如果我们使用maxDistance这样运行GeoSpatial MongdoDB查询:

db.getCollection('Places').aggregate([{
  "$geoNear": {
    "near": {
      "type": "Point",
      "coordinates": [-0.1251485, 51.5174914]
    },
    "spherical": true,
    "distanceField": "dist",
    "maxDistance": 2000,
    "query": {
      "field": "xxx"
    }
  }
}
}])

我们将获得以下结果作为示例:

[PlaceA, PlaceB, PlaceC]

然后,我们运行以下查询:

db.getCollection('Places').aggregate([{
    "$geoNear": {
      "near": {
        "type": "Point",
        "coordinates": [-0.1251485, 51.5174914]
      },
      "spherical": true,
      "distanceField": "dist",
      "maxDistance": 2000,
      "query": {
        "field": "xxx"
      }
    }
  },
  {
    $and: {
      name: {
        $eq: 'PlaceA'
      }
    },
  }
])

假设我们正尝试在此查询中获得PlaceA

如果我错了,请更正,但是MongoDB不首先应用地理查询,然后选择PlaceA, PlaceB, PlaceC,然后过滤掉PlaceB and PlaceC。换句话说,$and只是一个过滤器,我们可以使用for循环进行相同的过滤,而不必将其放入MongoDB查询中:

for (eachPlace in Places) {
   if (eachPlace == 'PlaceA') {
     return eachPlace;
   }
}

2 个答案:

答案 0 :(得分:2)

您可以将所有过滤器放入查询中,无需其他管道

db.getCollection('Places').aggregate([{
    "$geoNear": {
      "near": {
        "type": "Point",
        "coordinates": [-0.1251485, 51.5174914]
      },
      "spherical": true,
      "distanceField": "dist",
      "maxDistance": 2000,
      "query": {
        "field": "xxx",
        "name": {"$eq": 'PlaceA'}
      }
    }
  }
])

答案 1 :(得分:1)

首先,我认为您指的是$match操作,而不是$and,因为$and不能在管道中独立运行。

第二,Documents pass through the stages in sequence.,所以您的想法是正确的,聚合管道仅对通过前一阶段的文档应用过滤器

第三,在某种程度上,您会发现计算顺序与管道顺序不同。这是因为MongoDB足够聪明,可以优化管道,它可以合并阶段,重新排序阶段...以实现最佳性能。

有关更多详细信息,请查看optimization here