$ geoNear(聚合管道)没有返回正确的文档

时间:2016-04-19 09:42:34

标签: mongodb mongodb-query aggregation-framework

在聚合管道中使用$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" } );

1 个答案:

答案 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"选项相结合,因为这是您在初始搜索中真正考虑这两个标准的唯一方法。