$ geoNear聚合忽略maxDistance

时间:2014-09-16 07:19:53

标签: node.js mongodb node-mongodb-native

以下查询应返回距离为lng和lat的城市。城市集合在其gps字段中具有 2dsphere 索引。

City.native(function(err, collection) {
    collection.aggregate([{
        $geoNear: {
            near: {
                type: 'Point',
                coordinates: [lng, lat]
            },
            distanceField: 'dist',
            limit: limit,
            maxDistance: distance,
            distanceMultiplier: 1,
            spherical: true
        }
    }], function(err, result) {
            return res.send(result);
        }
    });
});

我的问题是,当我将距离设置为0时,查询仍会返回带有例如

的文档
"dist": 27507.15237596358

但它不应该返回任何东西,因为在距离为0的地方没有城市。任何想法我做错了什么?


查询:

lat=51.9637151&lng=8.5610982&distance=1

返回具有以下位置的文档:

"gps": {
  "type": "Point",
  "coordinates": [
    8.906756,
    52.030319
  ]
},
"dist": 24824.18378549408

但是maxDistance设置为1。


在我在上面的代码中使用聚合之前,我使用了这段代码并且它起作用了:

City.native(function(err, collection) {
    collection.geoNear(lng, lat, {
        limit: limit,
        maxDistance: maxDistance / 6371, // in km
        distanceMultiplier: 6371, // converts radians to miles (use 6371 for km)
        spherical: true
}, function(err, result) {});

然而,当我改为聚合时,它就停止了工作。

1 个答案:

答案 0 :(得分:1)

我用以下查询解决了这个问题:

$geoNear: {
   near: {
      type: 'Point',
      coordinates: [lng, lat]
   },
   distanceField: 'dist',
   limit: limit,
   maxDistance: distance * 1000,
   distanceMultiplier: 1 / 1000,
   spherical: true
}

似乎maxDistance接受值为米。因此,如果我希望它接受KM,我需要将它乘以1000.要输出距离为KM,distanceMultiplier必须为1/1000。