2013-03-13 11 views
11

私はしばらくの間探してきましたが、内部配列をソートして、現在作業しているドキュメントにその配列を保持することはできません。Mongodb sort inner array

{ 
    "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

あなたはソート順を使用して_idにそれらを一緒に戻っINGのdateによる結果のドキュメントをソートupdates配列を、INGの$unwindことによってこれを行う、その後、$groupことができます。

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

恐ろしい!私は集計にはかなり新しく、このようなことをすることができると感じました。 –

+0

アプリが "名前"のようなフィールドを持っていて、その結果セットに名前を残したかったらどうでしょうか? –

+0

@ user1251624あなたは '$ group'(' _id'または別のフィールド)と '$ project'にそのフィールドを含めます。それについてもっと助けが必要な場合は、別の質問としてそれを尋ねるのがおそらく最も重要です。 – JohnnyHK