在聚合管道中使用$geoNear
时,我没有收到正确的结果。使用典型的find()查询(使用$near
)的相同查询实际上会返回正确的结果。
但是,当删除相等条件(在schedule.key
上)时,两个查询都会返回正确的数据。
$geoNear
使用聚合管道:db.place.aggregate(
[
{
$geoNear: {
spherical: true,
near: { type: "Point", coordinates: [ 18.416145, -33.911973 ] },
distanceField: "dist"
}
},
{
$match: {
"schedule.key": { "$eq": "vo4lRN_Az0uwOkgBzOERyw" }
}
}
])
$near
查找查询:db.place.find(
{
"point" : {
$near: {
type: "Point",
coordinates: [ 18.416145,-33.911973 ]
}
},
"schedule.key" : {
$eq : "vo4lRN_Az0uwOkgBzOERyw"
}
})
此集合中的文档如下所示:
{
"_id" : UUID("da6ccbb1-3c7a-45d7-bc36-a5e6007cd919"),
"schedule" : {
"_id" : UUID("587de5b7-a744-4b28-baa8-e6efb5f7f921"),
"key" : "vo4lRN_Az0uwOkgBzOERyw"
},
"point" : {
"type" : "Point",
"coordinates" : [
18.425102,
-33.922153
]
},
"name" : "Cape Town"
}
我在点域上创建了适当的索引:
db.place.ensureIndex( { "point" : "2dsphere" } );
答案 0 :(得分:3)
不是"相同"查询完全。使用单独的$match
阶段存在明显差异,因为"过滤"只有"在"之后"最近的resuts"被发现。这意味着您可能会返回" less"结果,因为标准不是组合发布的。
这就是为什么$geoNear
中有"query"
选项的原因:
db.place.aggregate(
[
{
$geoNear: {
spherical: true,
near: { type: "Point", coordinates: [ 18.416145, -33.911973 ] },
distanceField: "dist",
query: {
"schedule.key": { "$eq": "vo4lRN_Az0uwOkgBzOERyw" }
}
}
}
])
现在这是相同的查询。或者如果您使用$nearSphere
则完全相同。由于$near
未考虑距离计算中地球的曲率。 $nearSphere
和$geoNear
确实如此。
但重点是与"query"
选项相结合,因为这是您在初始搜索中真正考虑这两个标准的唯一方法。