2011-03-31 185 views
4

我正在開發一個PHP應用程序,我們需要在特定邊界內檢索結果,但是按結果的創建日期排序,而不是距離。我認爲MongoDB的geoNear命令對此非常重要,因爲它負責計算每個結果的距離。但是,我想知道是否有方法通過create_date屬性指定排序,而不是距離。理想情況下,我將創建座標的複合關鍵字索引並創建日期,然後快速檢索按創建日期排序的特定區域中的所有結果。對MongoDB GeoNear結果進行排序而不是距離?

這是可能的,還是我必須做我的排序後查詢?

回答

2

正如我現在所知,您不能更改默認排序,因爲它在$ near命令內部完成。

documentation一些注意事項:

db.places.find({LOC:{$鄰近: [50,50]}}) 上面查詢查找 最近點到(50, 50)和 返回它們按距離排序( 不需要額外的排序 參數)。使用限制()來指定點返回的 最大數量(100 默認限制適用如果 不詳):

所以,你應該加載集合按距離排序,而不是爲了通過任何你想要的客戶端。

還有一點需要注意:如果你想在結果中按日期排序,按照日期排序,你可以照常使用sort({ date : -1 })

5

不過,我想知道是否有指定由CREATE_DATE屬性排序,而不是距離的方式...

如果您使用的$near命令,那麼你必須先排序通過距離或「近」的概念沒有任何意義。在地球上,一切都可以「靠近」某個特定點,這只是一個「多近」的問題。

你這裏有兩種選擇:

  1. 限制$near
  2. 結果使用$within命令

我想你要找的是什麼$within命令

center = [50, 50] 
radius = 10 
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}}) 

然後,您可以對SE其他一些關鍵:

db.places.find(...).sort({created:1}) 

然而,命令中可以提供過多的結果,所以你可能想要把一些邏輯來限制$within返回的項目數。

db.places.find(...).limit(50).sort({created:1}) 

事實是,如果你打一個特定的限制,您$within命令的值一般開始下降。您的客戶端代碼可能需要檢查您是否達到了最大結果。

+0

我認爲你錯了,通常情況下,你可以廣告排序到$附近,但它是一個在MongoDB中的錯誤,解決方法是$內: https://jira.mongodb.org/browse/SERVER-856 – Sekai 2014-03-31 10:02:07

相關問題