2013-02-07 16 views
12

Pracuję nad projektem nodejs + mongodb przy użyciu mangusty. Teraz natknąłem się na pytanie, na które nie znam odpowiedzi. Używam struktury agregacji, aby uzyskać pogrupowane wyniki. Grupowanie odbywa się w dniu z wyłączeniem pola danych czasu, takiego jak: "2013 02 06". Kod wygląda następująco:Sortuj według daty w ramce agregacji mangusty

MyModel.aggregate([ 
      {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}}, 
      {$group: { 
       _id: { 
        year: {$year: "$created_at"}, 
        month: {$month: "$created_at"}, 
        day: {$dayOfMonth: "$created_at"} 
       }, 
       count: {$sum: 1} 
      }}, 
      {$project: { 
       date: { 
         year: "$_id.year", 
         month:"$_id.month", 
         day:"$_id.day" 
       }, 
       count: 1, 
       _id: 0 
      }} 
     ], callback); 

Pogrupowane wyniki są doskonałe, z tym że nie są posortowane. Oto przykład wyjście:

[ 
    { 
     count: 1, 
     date: { 
      year: 2013, 
      month: 2, 
      day: 7 
     } 
    }, 
    { 
     count: 1906, 
     date: { 
      year: 2013, 
      month: 2, 
      day: 4 
     } 
    }, 
    { 
     count: 1580, 
     date: { 
      year: 2013, 
      month: 2, 
      day: 5 
     } 
    }, 
    { 
     count: 640, 
     date: { 
      year: 2013, 
      month: 2, 
      day: 6 
     } 
    } 
] 

wiem, sortowanie odbywa się poprzez dodanie tego: {$sort: val}. Ale teraz nie jestem pewien, co powinno być val, więc wyniki będą sortowane według daty, ponieważ mój klucz grupujący jest obiektem 3 wartości budujących datę. Czy ktoś wie, jak można to osiągnąć?

EDIT tryed to i to zadziałało :)

{$sort: {"date.year":1, "date.month":1, "date.day":1}}

Odpowiedz

9

Wydaje się, że kwestia ta ma bardzo prostą odpowiedź :) wystarczy posortować według wielu kolumn nesteed jak ten:

{$sort: {"date.year":1, "date.month":1, "date.day":1}} 
+0

Myślę, że możesz również zrobić grupę korekcji '{$ sort: {" date ": 1}}' – knowbody

5

Utknąłem z tym samym problemem, dziękuję za odpowiedź. Ale okazało się, że można uzyskać ten sam rezultat z mniej kodu

MyModel.aggregate([ 
      {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}}, 
      {$group: { 
       _id: { 
        year: {$year: "$created_at"}, 
        month: {$month: "$created_at"}, 
        day: {$dayOfMonth: "$created_at"} 
       }, 
       count: {$sum: 1} 
      }}, 
      {$project: { 
       date: "$_id", // so this is the shorter way 
       count: 1, 
       _id: 0 
      }}, 
      {$sort: {"date": 1} } // and this will sort based on your date 
     ], callback); 
0

to będzie działać, jeśli tylko sortowania według daty, gdybyś miał inną columsn aby posortować. Będziesz musiał rozszerzyć _id

+0

tylko z datą –

+0

Powinieneś zaktualizować swoją odpowiedź z poprawką, nie umieszczając jej jako komentarz. – drneel