2013-03-13 90 views
11

我一直在尋找一段時間,似乎無法排序內部數組,並保持在我目前正在使用的文檔中。Mongodb排序內部陣列

{ 
    "service": { 
     "apps": { 
      "updates": [ 
       { 
       "n" : 1 
       "date": ISODate("2012-03-10T16:15:00Z") 
       }, 
       { 
       "n" : 2 
       "date": ISODate("2012-01-10T16:15:00Z") 
       }, 
       { 
       "n" : 5 
       "date": ISODate("2012-07-10T16:15:00Z") 
       } 
      ] 
     } 
    } 
} 

所以我想保留該項目作爲服務返回,但有我的更新數組排序。到目前爲止,我有:

db.servers.aggregate(
     {$unwind:'$service'}, 
     {$project:{'service.apps':1}}, 
     {$unwind:'$service.apps'}, 
     {$project: {'service.apps.updates':1}}, 
     {$sort:{'service.apps.updates.date':1}}); 

任何人都認爲他們可以幫助嗎?

回答

25

您可以通過$unwind做到這一點的荷蘭國際集團陣列updatesdate排序產生的文檔,然後使用$group排定的順序荷蘭國際集團他們重新走到一起上_id

db.servers.aggregate(
    {$unwind: '$service.apps.updates'}, 
    {$sort: {'service.apps.updates.date': 1}}, 
    {$group: {_id: '$_id', 'updates': {$push: '$service.apps.updates'}}}, 
    {$project: {'service.apps.updates': '$updates'}}) 
+0

太棒了!我對聚合非常陌生,並且有一種感覺,它可以做這樣的事情。 – 2013-03-13 15:26:03

+0

如果應用程序具有「名稱」字段,並且我想將名稱保留在結果集中,那麼該怎麼辦? – 2013-03-13 15:57:33

+0

@ user1251624你可以在'$ group'(在'_id'或作爲一個單獨的字段)和'$ project'中包含該字段。如果你需要更多的幫助,最好把它當作一個單獨的問題來討論,因爲它可以是不重要的。 – JohnnyHK 2013-03-13 16:06:18