2013-07-11 6 views
10

Ich versuche, meine Daten am Tag zu aggregieren, damit ich sie in einem Diagramm rendern kann. Ich habe es geschafft, dies erfolgreich durch Gruppierung von $year, $month und $dayOfMonth zu tun. Das bedeutet jedoch, dass mein Datum nun im Endergebnis in drei Teile aufgeteilt ist. Gibt es eine Möglichkeit, die drei Zahlen wieder in ein Datumsformat zu konvertieren oder gibt es eine andere Möglichkeit, nach Tagen zu gruppieren, bei denen das Datum nicht geteilt wird? Im Folgenden finden Sie ein funktionierendes Beispiel von dem, was ich habe:

Sentiment.aggregate([ 
    { 
     $match: { 'content.term' : term_id } 
    }, { 
     $group: { 
      _id: { 
       year  : { $year  : '$created_at' }, 
       month  : { $month  : '$created_at' }, 
       dayOfMonth : { $dayOfMonth : '$created_at' }, 
      }, 
      sum : { $sum : '$score'}, 
      count : { $sum : 1 } 
     }, 
    }, { 
     $project: { 
      _id : 0, 
      date : '$_id', 
      sum : 1, 
      count : 1, 
      avg : { $divide: ['$sum', '$count'] } 
     } 
    } 
], function(err, result){ 
    if(err) callback(err); 
    else callback(null, result); 
}); 

Und hier ist ein Beispielergebnis:

[ 
    { 
    "sum": 201, 
    "count": 3, 
    "date": { 
     "year": 2013, 
     "month": 7, 
     "dayOfMonth": 5 
    }, 
    "avg": 67 
    }, 
    { 
    "sum": 186, 
    "count": 6, 
    "date": { 
     "year": 2013, 
     "month": 7, 
     "dayOfMonth": 8 
    }, 
    "avg": 31 
    }, 
    { 
    "sum": 834, 
    "count": 9, 
    "date": { 
     "year": 2013, 
     "month": 7, 
     "dayOfMonth": 9 
    }, 
    "avg": 92.66666666666667 
    } 
] 

Im Idealfall würde Ich mag date ein gültiges Datum sein haben, so habe ich nicht um es später zu konvertieren. Ich habe versucht, $concat zu verwenden, aber das funktioniert nur mit Zeichenfolgen. Ich verwende Mongoose, wenn das einen Unterschied macht.

Antwort

19

Unter der Annahme, dass, wie Sie Dokumente, die von Jahr, Monat und Tag gruppieren, Stunden und Minuten nutzlos sind, können Sie eine dieser Operatoren verwenden, um ein Datum Probe zu erhalten: $first, $last, $min oder $max.

Sentiment.aggregate([ 
    { 
     $match: { 'content.term' : term_id } 
    }, { 
     $group: { 
      _id: { 
       year  : { $year  : '$created_at' }, 
       month  : { $month  : '$created_at' }, 
       dayOfMonth : { $dayOfMonth : '$created_at' }, 
      }, 
      dt_sample : { $first : '$created_at' }, 
      sum : { $sum : '$score'}, 
      count : { $sum : 1 } 
     }, 
    }, { 
     $project: { 
      _id : 0, 
      date : '$dt_sample', 
      sum : 1, 
      count : 1, 
      avg : { $divide: ['$sum', '$count'] } 
     } 
    } 
], function(err, result){ 
    if(err) callback(err); 
    else callback(null, result); 
}); 

Sie haben ein Datumsfeld mit einer beliebigen Stunde, Minute und Sekunden.

+0

Das ist, was ich gesucht habe. Vielen Dank! –

+5

Warum funktioniert das? –

Verwandte Themen