因此,如果我们使用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;
}
}
答案 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