2013-11-04 145 views
0

有沒有辦法對多個字段進行排序?例如按last_edited_id時間戳排序?基本上我需要在兩個領域進行排序,就好像他們是單個領域一樣。所以複合指數似乎不適用於這種情況。排序在多個字段?

例如

對於指數:{ a: 1, b: 1 }

蒙戈回報:

[{ a: 1, b: 1 }, { a: 1, b: 4 }, { a: 2, b: 2 }, { a: 2, b: 3 }]

,而我需要它返回:

[{ a: 1, b: 1 }, { a: 2, b: 2 }, { a: 1, b: 3 }, { a: 1, b: 4 }]

從小到大順序的場更大的價值取代了其他領域。

回答

1

可以使用聚合框架做到這一點,但你將無法使用索引的它是一個相當強力的解決方案。

db.foo.aggregate(
    {$project: {a: 1, b: 1, sortKey: {$cond: [{$gt: ["$a", "$b"]}, "$a", "$b"]}}}, 
    {$sort: {sortKey: 1}}, 
    {$project: {a: 1, b: 1}} 
) 

如果你的收藏是通過聚合類似的東西來處理的話可以通過map-reduce實現。

+0

這是否獲取所有文檔,然後選擇內存中的更大的領域,然後排序呢?它會執行相同的還是比從一個單一的組合字段進行文檔創建時的排序還差? – paulkon

+1

肯定更糟。合併和索引字段是最好的解決方案。 – zero323

+0

我想在創建和編輯將來上'updated'場我就產生一個時間戳和排序就可以了。 – paulkon

1

是的,可以。如果你有documentes集合

{_id : 5, last_edited : 7} 
{_id : 4, last_edited : 1} 
{_id : 9, last_edited : 7} 
{_id : 3, last_edited : 1} 
{_id : 6, last_edited : 1} 

您可以用兩個領域解決這(順序事項):

db.a.find().sort({last_edited: 1, _id : 1}) 

正如你看到的,結果被last_edited場先進行排序,然後才由_id如果你做到這一點只能通過last_edited場,你是不是在_id場的順序控制。

你可以有指數無論是在last_editedlast_edited_id領域。

+0

與此查詢的問題是,它只能通過各種_id後last_edited已排序,只有當最後編輯時間戳記發生不止一次。我需要將last_edited和_id **一起排序**,這意味着我不希望一個字段在排序過程中取代另一個字段。我基本上想要在對文檔進行排序時合併這兩個字段,就像我在單個字段上進行排序一樣。 – paulkon