Когда я пытаюсь найти документ с определенными геоколями, используя метод geoNear(), расчет расстояния MongoDB, как представляется, выключен, в результате получается пустой массив результатов.MongoDB/Mongoose geoNear возвращает неправильное расстояние
У меня есть следующий документ в моей коллекции местах:
{
"_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));
});
};
Наконец, это запрос, который я делаю:
http://localhost:3000/api/locations?lng=-73.9827568&lat=40.7791425&maxDistance=10
Однако я получаю пустой массив результатов, даже если это местоположение находится в пределах 10 км от координат, указанных в моем запросе. Если изменить параметры maxDistance
запроса до 100000, результат возвращается, показывая расстояние 749557.1657218104 км:
[{"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"}]
я использовал http://www.movable-type.co.uk/scripts/latlong.html для вычисления расстояния между этими двумя наборами координат, и увидел, что они являются лишь 0,1175 км друг от друга.
Другое примечание: если я использую точные координаты, связанные с местоположением (-73.983342, 40.778183), в моем запросе возвращается место с правильным расстоянием 0 км.
Успешный запрос:
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"}]
Любые идеи, что я делаю неправильно здесь? Спасибо!