2013-03-26 25 views
0

我正在嘗試查找位於任何一個位置列表中的所有用戶(此位置列表可能較大,因此執行的查詢多於服務器上的一個聯合,方,不一定是理想的)。Mongo - 一次查詢多個位置

例如,用例可以找到所有用戶,這些用戶在我當前城市的任何教堂的2英里內居住,並給出這些教堂的座標列表。

眼下,這以下位置查詢工作:

db.users.count({ location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2/3959 ] } } }) 

還有:

db.users.count({location : { $near : [ -84.330984 , 33.8615 ] , $maxDistance : 2/69 } }) 

不過,我希望能夠指望誰住在一個用戶數量不同地點的範圍。即是這樣的:

db.users.count({ $or: [{ location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2/3959 ] } } },{ location: { $within: { $centerSphere: [ [-85.331122, 34.97832], 2/3959 ] } } } ] }) 

現在,當我運行此查詢,蒙戈給出了記錄錯誤:

Tue Mar 26 17:24:22 uncaught exception: count failed: { 
"errmsg" : "exception: $or may not contain 'special' query", 
"code" : 13291, 
"ok" : 0 
} 

從此錯誤和開放JIRA票(https://jira.mongodb.org/browse/SERVER-3984),蒙戈目前從有限能夠使用$或(或$ all)運算符執行多個位置查詢,因此我無法鏈接位置查詢。

是否有最佳做法或解決方法來完成此操作?再一次,我不想爲每個位置分別查詢,而不是將它們合併在一起;儘管我意識到這可能是唯一的選擇。

我目前使用的是Mongo 2.2.3,但如果能夠解決這個難題,那麼升級到2.4就沒有問題。

謝謝

+0

正如雷說,這還沒有實現,並因此你需要使用一個Map Reduce函數(運行在服務器上),或者使用聚合框架(地理查詢2.4支持) 看到這個http://docs.mongodb.org/manual/release-notes/2.4/#improvements-to-the-aggregation-framework 而這個例子: http://stackoverflow.com/a/15209920/ 728287 – 2013-03-27 12:35:22

回答

1

如果您熟悉JavaScript,則可以使用mapReduce來實現此目的。

但是,有兩種方法需要構建$ near和$ centerSphere,並且不能執行超過1000條記錄的mapreduce。

由於mongoDB限制$或操作符,所以這是解決這個問題的第一個想法。

http://docs.mongodb.org/manual/applications/map-reduce/