当我使用$ near(查找)和$ geoNear(聚合)MongoDB调用查询同一集合时,得到的结果数量不同。这两个查询对我来说看起来是一样的,为什么我得到的结果数会不同?我的收藏有一个索引:{'location':'2dsphere'}
// 14,873 customers
db.customers.find({
'location': {
'$near': {
'$geometry': {
'type' : 'Point',
'coordinates' : [-98.496244, 29.421417] // ~San Antonio
},
'$maxDistance' : 9999999
}
}
}).toArray();
// 5732 customers
db.customers.aggregate([
{'$geoNear' : {
'near' : {
'type' : 'Point',
'coordinates' : [-98.496244, 29.421417] // ~San Antonio
},
'distanceField': 'distance',
'maxDistance': 9999999,
'spherical' : true,
'limit' : 100000000000
}}
]).toArray();
我希望每个查询中数组中的项数相同。如果将“ $ maxDistance”(在查找结果上)和“ maxDistance”(在合计上)更改为999,999(而不是9,999,999),则在每种情况下我得到的结果数均相同(327)
...但是似乎如果我查询的区域太大,则会得到不同的结果。这是为什么?我究竟做错了什么?还是球面有所不同:true和$ near之间的默认度量是什么?
更新: 两个查询的分歧点大约是5000-6000个结果。如果我计算这两个查询返回的项目,我可以从查找中找回看似无限的项目(最多约900,000个),但最多只能从$ geoNear聚合中取回6,800个项目。这可能是硬件限制吗?
解决方案,对于绊脚石的任何人: 我对此没有任何回应,但是我认为我误解了$ geoNear的用法。我将其用作聚合函数的第一阶段。 (在我看来)仅当您想返回到中心的距离时才有用。如果要计算结果,则应在$ match中使用$ geoWithin,并将米转换为弧度。
示例:
// 14,873 customers
db.customers.find({
'location': {
'$near': {
'$geometry': {
'type' : 'Point',
'coordinates' : [-98.496244, 29.421417] // ~San Antonio
},
'$maxDistance' : 9999999
}
}
}).toArray();
// 14,873 customers
db.customers.aggregate([
{$match: {
'location' : {
'$geoWithin' : {
'$centerSphere' : [[-98.496244, 29.421417], (9999999 / 1609.34) / 3963.2] // also need to convert to radians!
}
}
}}
]).toArray();
埋在$ match文档中,说可以使用$ geoWithin: https://docs.mongodb.com/manual/reference/operator/aggregation/match/#restrictions
...但在$ geoWithin文档中未提及: https://docs.mongodb.com/manual/reference/operator/query/geoWithin/