2016-03-13 79 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 

但是,即使位置在我的請求中指定的座標的10km範圍內,我也只會獲得空的數組結果。如果我改變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包並重試。

相關問題