Node.js MongoDB/Mongoose geoNear返回的距离不正确

Node.js MongoDB/Mongoose geoNear返回的距离不正确,node.js,mongodb,mongoose,distance,Node.js,Mongodb,Mongoose,Distance,当我尝试使用geoNear()方法查找具有定义的地理坐标的文档时,MongoDB的距离计算似乎处于关闭状态,导致结果数组为空 我的位置收藏中有以下文档: { "_id" : ObjectId("56e4791244ea3215c8537425"), "name" : "Cool Place", "address" : "224 West 71th Street, New York, NY 10023", "rating" : 5, "facilities"

当我尝试使用geoNear()方法查找具有定义的地理坐标的文档时,MongoDB的距离计算似乎处于关闭状态,导致结果数组为空

我的位置收藏中有以下文档:

{
    "_id" : ObjectId("56e4791244ea3215c8537425"),
    "name" : "Cool Place",
    "address" : "224 West 71th Street, New York, NY 10023",
    "rating" : 5,
    "facilities" : [...etc...],
    "coords" : [
        -73.983342,
        40.778183
    ],
    "openingTimes" : [...etc...],
    "reviews" : [...etc...]
}
我的模式如下所示:

var locationSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  address: String,
  rating: {
    type: Number,
    'default': 0,
    min: 0,
    max: 5
  },
  facilities: [String],
  coords: {
    type: [Number],
    index: '2dsphere'
  },
  openingTimes: [openingTimeSchema],
  reviews: [reviewSchema]
});
var theEarth = (function () {
  var earthRadius = 6371; // km, miles is 3959

  var getDistanceFromRads = function (rads) {
    return parseFloat(rads * earthRadius);
  };

  var getRadsFromDistance = function (distance) {
    return parseFloat(distance / earthRadius);
  };

  return {
    getDistanceFromRads: getDistanceFromRads,
    getRadsFromDistance: getRadsFromDistance
  };
})();

var buildResultsList = function (results) {
  var resultsList = [];

  results.forEach(function (doc) {
    resultsList.push({
      distance: theEarth.getDistanceFromRads(doc.dis),
      name: doc.obj.name,
      address: doc.obj.address,
      rating: doc.obj.rating,
      facilities: doc.obj.facilities,
      coords: doc.obj.coords,
      _id: doc.obj._id
    });
  });

  return resultsList;
};

module.exports.locationsListByDistance = function (req, res) {
  var lng = parseFloat(req.query.lng);
  var lat = parseFloat(req.query.lat);
  var maxDistance = parseFloat(req.query.maxDistance);

  var point = {
    type: 'Point',
    coordinates: [lng, lat]
  };

  var geoOptions = {
    spherical: true,
    maxDistance: theEarth.getRadsFromDistance(maxDistance),
    num: 10
  };

  Loc.geoNear(point, geoOptions, function (err, results, stats) {
    sendJsonResponse(res, 200, buildResultsList(results));
  });
};
控制器的相关部分如下所示:

var locationSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  address: String,
  rating: {
    type: Number,
    'default': 0,
    min: 0,
    max: 5
  },
  facilities: [String],
  coords: {
    type: [Number],
    index: '2dsphere'
  },
  openingTimes: [openingTimeSchema],
  reviews: [reviewSchema]
});
var theEarth = (function () {
  var earthRadius = 6371; // km, miles is 3959

  var getDistanceFromRads = function (rads) {
    return parseFloat(rads * earthRadius);
  };

  var getRadsFromDistance = function (distance) {
    return parseFloat(distance / earthRadius);
  };

  return {
    getDistanceFromRads: getDistanceFromRads,
    getRadsFromDistance: getRadsFromDistance
  };
})();

var buildResultsList = function (results) {
  var resultsList = [];

  results.forEach(function (doc) {
    resultsList.push({
      distance: theEarth.getDistanceFromRads(doc.dis),
      name: doc.obj.name,
      address: doc.obj.address,
      rating: doc.obj.rating,
      facilities: doc.obj.facilities,
      coords: doc.obj.coords,
      _id: doc.obj._id
    });
  });

  return resultsList;
};

module.exports.locationsListByDistance = function (req, res) {
  var lng = parseFloat(req.query.lng);
  var lat = parseFloat(req.query.lat);
  var maxDistance = parseFloat(req.query.maxDistance);

  var point = {
    type: 'Point',
    coordinates: [lng, lat]
  };

  var geoOptions = {
    spherical: true,
    maxDistance: theEarth.getRadsFromDistance(maxDistance),
    num: 10
  };

  Loc.geoNear(point, geoOptions, function (err, results, stats) {
    sendJsonResponse(res, 200, buildResultsList(results));
  });
};
最后,这是我提出的要求:

http://localhost:3000/api/locations?lng=-73.9827568&lat=40.7791425&maxDistance=10
然而,我只得到一个空的结果数组,即使位置在我在请求中指定的坐标10公里以内。如果我将
maxDistance
query参数更改为100000,则返回结果,显示距离为749557.1657218104 km:

[{"distance":749557.1657218104,"name":"Cool Place","address":"224 West 71th Street, New York, NY 10023","rating":5,"facilities":["Hot drinks","Premium wifi"],"coords":[-73.983342,40.778183],"_id":"56e4791244ea3215c8537425"}]
我曾经计算过这两组坐标之间的距离,发现它们之间的距离只有0.1175公里

另一个注意事项:如果在查询中使用与位置(-73.983342,40.778183)关联的精确坐标,则返回位置,正确距离为0 km

成功请求:

http://localhost:3000/api/locations?lng=-73.983342&lat=40.778183&maxDistance=10
返回:

[{"distance":0,"name":"Cool Place","address":"224 West 71th Street, New York, NY 10023","rating":5,"facilities":["Hot drinks","Premium wifi"],"_id":"56e4791244ea3215c8537425"}]

知道我做错了什么吗?谢谢大家!

你使用什么版本的猫鼬?尝试使用“mongoose”:“~3.8.20”并更新npm包,然后重试