2014-08-30 1 views
0

Я использую драйвер mongoose в приложении js узла.Mongoose geoNear возвращает странные расстояния

Я попытался с помощью функции geoNear следующим образом:

Hike.geoNear(point, { spherical : true }, function(err, results, stats) { 
    if (err) { 
     console.log(err); 
     callback(false); 
    } else { 
     console.log('Here'); 
     console.log(results); 
     callback(results); 
    } 
}); 

По неизвестной причине, я получаю очень короткие расстояния: 0,0009827867330778472
по сравнению с тем же запросом прямо в Монго (без мангуста): +6268,312062243817

Любая идея, почему Mongoose изменяет результаты?

ответ

1

Он возвращает расстояние в радианах, которое необходимо преобразовать в измерение расстояния, основанное на радиусе сферы.

Радиус земли 6371km (3959 миль). Я использовал эту вспомогательную функцию в прошлом:

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 
    }; 
})(); 

Учитывая, что вам нужно сделать изменения для каждого результата возвращается вы, вероятно, захотите перебрать их и преобразовать расстояние в какой-то момент в коде. Например:

Hike.geoNear(point, { spherical : true }, function(err, results, stats) { 
    if (err) { 
    console.log(err); 
    callback(false); 
    } else { 
    console.log('Here'); 
    results.forEach(function(doc) { 
     doc.distance: theEarth.getDistanceFromRads(doc.dis) 
    }); 
    console.log(results); 
    callback(results); 
    } 
}); 
+0

Спасибо за ваш ответ. Вы знаете, можно ли поменять значение по умолчанию на счетчики вместо Rads? –

+1

В параметрах geoNear вы можете попробовать установить 'distanceMultiplier' как 6371000 - это опция MongoDB, которую может пройти Mongoose. например 'Hike.geoNear (точка, {сферическая: true, distanceMultiplier: 6371000}, function (err, results, stats) {' –

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