2015-12-11 109 views
0

我正在使用$geoWithin爲圓,我沒有得到預期的結果。有兩個收藏品,一個用於users,另一個用於items。我正在設置項目的半徑和座標。所以我必須在該座標和半徑內找到用戶。

用戶採集

{ 
    "_id" : NumberLong(25287), 
    "_class" : "com.samepinch.domain.user.User", 
    "name":"XYZ", 
    "location" : [ 
     74.866247, 
     31.63336 
    ] 
} 

項收藏

{ 
    "_id" : NumberLong(46603), 
    "itemName" : "Chandigarh", 
    "categoryName" : "TRAVELLING", 
    "location" : { 
     "_id" : null, 
     "longitude" : 77.15319738236303, 
     "latitude" : 28.434568229025803, 
     "radius" : 29153.88048637637 
    } 
} 

爲根據項目的座標和用戶座標,有大約兩個地在500公里的距離。

查詢

db.users.find({ location: { $geoWithin: { $center: [ [77.15319738236303,28.434568229025803], 29153.88048637637/3963.2] } } }).count() 

據$ geoWithin,用戶應該無法顯示,但它顯示。如果我做錯了什麼,請幫助我。

謝謝

回答

1

我認爲你的問題是,你正在尋找一個太寬的半徑。 按照MongoDB documentation$centerSphere正確的語法是:

db.<name>.find({ 
    loc: { $geoWithin: 
    { 
     $centerSphere: [ [ <longitude>, <latitude> ], 
     <radius in MILES>/3963.2 ] } 
    } 
}) 

現在你已經在你的周圍點29153.88048637637英里半徑搜索點,這兩個點都在你身邊所定義的中心是半徑。

我希望這可以幫助您:)

+0

那麼我應該怎麼做,如果我想在一個太寬的半徑搜索? –

+0

您正在搜索半徑約29.153英里=約46.917公里。因爲地球的半徑只有6.371km,邏輯上地球上的每個點都會滿足你的'$ geoWithin'條件。你應該考慮讓你的半徑更小。 – KoenVE

2

如果你想查詢你的項目涉及到$geoWithin$centerSphere在將來然後指定這樣才你的領域結構: -

"location" : { 
 
     "lng" : 77.15319738236303, 
 
     "lat" : 28.434568229025803 
 
    }, 
 
"redius" : 120

然後做如下查詢: -

db.collection.find({location: { $geoWithin: { $centerSphere: [ [ lat, lng ], radius/3963.2] } }})

0

只因爲我遇到了現在這樣幾次,我想闡述一下Ashutosh說的答案。

半徑必須以弧度表示,並且轉換基於您希望使用的單位的球體半徑。假設您正在使用地球作爲球體,並且您希望$geoWithin以米爲單位,那麼您應將radius字段設置爲meters/(6371*1000),或者您希望的距離除以距離所代表的單位的地球半徑。

這份名單應該有所幫助:

  • (米):距離meters/6371000(地球在米平均半徑)
  • 里程數:距離km/6371
  • 萬里:距離miles/3959
  • 英尺:距離feet/20903520