MongoDB查询$ near(在.find中)和$ geoNear(在.aggregate中)产生不同数量的结果

时间:2019-05-17 17:45:12

标签: mongodb

当我使用$ 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/

0 个答案:

没有答案