2013-03-13 22 views
11

Ho cercato per un po 'di tempo e non riesco a ordinare un array interno e mantenerlo nel documento con cui sto attualmente lavorando.Mongodb ordinamento matrice interna

{ 
    "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") 
       } 
      ] 
     } 
    } 
} 

Quindi voglio mantenere l'articolo da restituire come servizio, ma ho ordinato il mio array di aggiornamenti. Finora con la shell che ho:

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

Qualcuno pensa di poter essere d'aiuto?

risposta

25

È possibile fare questo $unwind ing matrice updates, l'ordinamento dei documenti risultanti dal date, e poi $group ing di nuovo insieme sul _id utilizzando il modo ordinato.

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

Fantastico! Sono abbastanza nuovo nell'aggregazione e ho avuto la sensazione che potesse fare qualcosa del genere. –

+0

e se le app avessero un campo come "nome" e volevo mantenere il nome anche nel set di risultati? –

+0

@ user1251624 Dovresti includere quel campo nel '$ gruppo' (nel' _id' o come campo separato) e '$ progetto'. Se hai bisogno di ulteriore aiuto su questo è probabilmente meglio chiederlo come una domanda separata in quanto può essere non banale. – JohnnyHK

Problemi correlati