我正在開發一個PHP應用程序,我們需要在特定邊界內檢索結果,但是按結果的創建日期排序,而不是距離。我認爲MongoDB的geoNear命令對此非常重要,因爲它負責計算每個結果的距離。但是,我想知道是否有方法通過create_date屬性指定排序,而不是距離。理想情況下,我將創建座標的複合關鍵字索引並創建日期,然後快速檢索按創建日期排序的特定區域中的所有結果。對MongoDB GeoNear結果進行排序而不是距離?
這是可能的,還是我必須做我的排序後查詢?
我正在開發一個PHP應用程序,我們需要在特定邊界內檢索結果,但是按結果的創建日期排序,而不是距離。我認爲MongoDB的geoNear命令對此非常重要,因爲它負責計算每個結果的距離。但是,我想知道是否有方法通過create_date屬性指定排序,而不是距離。理想情況下,我將創建座標的複合關鍵字索引並創建日期,然後快速檢索按創建日期排序的特定區域中的所有結果。對MongoDB GeoNear結果進行排序而不是距離?
這是可能的,還是我必須做我的排序後查詢?
正如我現在所知,您不能更改默認排序,因爲它在$ near命令內部完成。
從documentation一些注意事項:
db.places.find({LOC:{$鄰近: [50,50]}}) 上面查詢查找 最近點到(50, 50)和 返回它們按距離排序( 不需要額外的排序 參數)。使用限制()來指定點返回的 最大數量(100 默認限制適用如果 不詳):
所以,你應該加載集合按距離排序,而不是爲了通過任何你想要的客戶端。
還有一點需要注意:如果你想在結果中按日期排序,按照日期排序,你可以照常使用sort({ date : -1 })
。
不過,我想知道是否有指定由CREATE_DATE屬性排序,而不是距離的方式...
如果您使用的$near
命令,那麼你必須先排序通過距離或「近」的概念沒有任何意義。在地球上,一切都可以「靠近」某個特定點,這只是一個「多近」的問題。
你這裏有兩種選擇:
$near
$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
命令的值一般開始下降。您的客戶端代碼可能需要檢查您是否達到了最大結果。
我認爲你錯了,通常情況下,你可以廣告排序到$附近,但它是一個在MongoDB中的錯誤,解決方法是$內: https://jira.mongodb.org/browse/SERVER-856 – Sekai 2014-03-31 10:02:07