2012-08-07 87 views
1

我想從以下數據獲取最近的數據 - MongoDB的

> db.points.insert({name:"Skoda" , pos : { lon : 30, lat : 30 } }) 
> db.points.insert({name:"Honda" , pos : { lon : -10, lat : -20 } }) 
> db.points.insert({name:"Skode" , pos : { lon : 10, lat : -20 } }) 
> db.points.insert({name:"Skoda" , pos : { lon : 60, lat : -10 } }) 
> db.points.insert({name:"Honda" , pos : { lon : 410, lat : 20 } }) 

> db.points.ensureIndex({ loc : "2d" }) 

獲得的最近數據,然後我試圖

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[0 , 0],5]}}}) 

這個時候,我得到了不同的錯誤

error: { 
    "$err" : "Spherical MaxDistance > PI. Are you sure you are using radians?", 
    "code" : 13461 

然後我試了

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[10 , 10],2]}}}) 
error: { 
    "$err" : "Spherical distance would require wrapping, which isn't implemented yet", 
    "code" : 13462 

如何完成此操作?我只想根據來自GEO點的給定輻射得到最接近的數據。

謝謝

+0

你找到一個解決方案@syv? – Burak 2016-01-19 06:56:45

回答

2

有幾件事要注意。首先,您將座標存儲在名爲「pos」的字段中,但是您在名爲「loc」的字段上執行查詢(並創建了索引)。

$ centerSphere將採用一組座標和一個以弧度表示的值。所以$ centerSphere:[[10,10],2]在一個圓圈中搜索[10,10],這個圓圈是2 *(地球半徑)= 12,756公里的圓。 $ centerSphere運算符不是爲了在這個大的區域搜索文檔而設計的(並且繞着地球兩極纏繞很棘手)。嘗試使用較小的值,例如.005。

最後,將座標作爲元素存儲在數組中可能是一個更好的主意,因爲某些驅動程序可能無法保留文檔中字段的順序(並將緯度和經度交換爲完全不同的地理位置)。

+0

感謝您的意見!我得到了它的工作。 – syv 2012-08-07 18:40:02

0

希望這有助於:

地球的半徑大約爲3963.192英里或6378.137公里。

對於1個一:

db.places.find({ loc: { $centerSphere: [ [ -74, 40.74 ] , 
            1/3963.192 ] } })