2016-12-15 58 views
0

在我的MongoDB數據庫中我有大量的位置(座標可以重複)。我試圖找到第一個最近的位置(經度/緯度)。在我的模型,我有這樣的:貓鼬找到第一個最近的位置

var mySchema = new Schema({ 
    loc:{ 
     type : [Number], 
     index: '2d' 
    }, 
    ... 
}); 

我看到比MongoDB的實施$near方法計算最近的位置。然後我試過這個

Model.find({loc: {$near:[1.4072964, 7.826107], $maxDistance: 1} }, function(err, result){ 
    result.forEach(function(doc){ 
     console.log(doc.loc) 
    }) 
}); 

問題是它會返回距離這個點最近的所有位置,大約1米。但我不需要最大距離,我只想找到第一個最近的位置。

我不能使用findOne這是因爲我需要獲取這個第一個位置的所有重複數據。

E.g.如果找到的第一個座標是-5.95001220703125, 51.5499954223633,並且我有這個位置10次,則需要獲取包含此位置的所有文檔。

所以有可能只用一次Mongoose Query來做到這一點?或者我不應該使用MongoDB地理空間索引並在我的應用程序中自己計算最近的距離?

回答

0

我建議將您的查詢兩個部分:

  • 尋找最近的文檔。
  • 查找它的重複項。

要找到最接近的文檔,您可以使用$nearsphere運算符。

// you can use callbacks if you want 
let closestQuery = 
    Person 
    .find({ 
     loc: { 
     $nearsphere: coords 
     } 
    }) 
    .limit(1) 
    .exec(); 

closestQuery.then(doc => ...); 

然後你只需要找到相同的位置,以獲取重複。

+0

我試過了,但我的查詢需要4秒鐘才能搜索到一個非常慢的值。 – John