2016-03-13 3 views
0

Когда я пытаюсь найти документ с определенными геоколями, используя метод 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"}] 

Любые идеи, что я делаю неправильно здесь? Спасибо!

ответ

0

Какую версию Mongoose вы используете? Попробуйте использовать «mongoose»: «~ 3.8.20» и обновите пакет npm и повторите попытку.

Смежные вопросы