2013-03-13 18 views
11

Szukałem już od jakiegoś czasu i nie mogę uporządkować wewnętrznej tablicy i zachować ją w dokumencie, z którym obecnie pracuję.Mongodb sortuj wewnętrzną tablicę

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

Chcę, aby przedmiot został zwrócony jako usługa, ale posortuj moją tablicę aktualizacji. Jak dotąd z muszlą mam:

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

Ktoś myśli, że mogą w tym pomóc?

Odpowiedz

25

Można to zrobić przez $unwind ing tablicę updates, sortowania wynikające z Dokumentów przez date, a następnie $group ing je razem na _id pomocą posortowanych.

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

Awesome! Jestem całkiem nowy w agregacji i miałem przeczucie, że może zrobić coś takiego. –

+0

co by było, gdyby aplikacje miały pole takie jak "nazwa" i chciałem zachować nazwę również w zestawie wyników? –

+0

@ user1251624 Należy uwzględnić to pole w '$ group' (w' _id' lub jako osobne pole) i '$ project'. Jeśli potrzebujesz więcej pomocy, prawdopodobnie najlepiej jest zadać to jako oddzielne pytanie, ponieważ może to być nietrywialne. – JohnnyHK

Powiązane problemy