2016-06-09 7 views
1

Dies ist, wie meine Sammlung Struktur wie folgt aussieht:Gruppe und die Summe von Tag zu Tag

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-06T22:33:13.000Z") 
} 

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-07T22:33:13.000Z") 
} 

{ 
    "_id" : ObjectId("57589d2a9108dace306602b8"), 
    "IDproject" : NumberLong(53), 
    "email" : "[email protected]", 
    "dc" : ISODate("2016-06-078T22:33:13.000Z") 
} 

Wie Sie sehen können, gibt es zwei Kunden am 7. Juni und einer am 6. Juni aufgenommen. Ich möchte diese Ergebnisse für die letzten 30 Tage gruppieren und zusammenfassen.

Es sollte etwa wie folgt aussieht:

{ 
    "dc" : "2016-06-05" 
    "total" : 0 
} 

{ 
    "dc" : "2016-06-06" 
    "total" : 1 
} 

{ 
    "dc" : "2016-06-07" 
    "total" : 2 
} 

Wie können Sie sehen, es gibt keine Aufzeichnungen am 6. Juni, so ist es Null. Es sollte Null für 5. Juni usw.

sein, dass der Fall # 1, und der Fall # 2 folgende Ergebnisse würden:

{ 
     "dc" : "2016-06-05" 
     "total" : 0 
    } 


    { 
     "dc" : "2016-06-06" 
     "total" : 1 
    } 


    { 
     "dc" : "2016-06-07" 
     "total" : 3 
    } 

Ich habe versucht, dies:

db.getCollection('customer').aggregate([ 
{$match : { IDproject : 53}},  
{ $group: { _id: "$dc", total: { $sum: "$dc" } } }, ]); 

Aber scheint kompliziert. Ich arbeite das erste Mal mit der NoSQL-Datenbank.

Danke.

+0

Okay. Das ist viel besser: 'db.getCollection ('Kunde'). Aggregat ([ {$ Übereinstimmung: {IDproject: 53}}, {$ Gruppe: {_id:" $ dc ", total: {$ Summe : 1}}}, ]); ' Nur müssen Sie herausfinden, wie Sie eine Null zur Gesamtzahl hinzufügen, und erhalten Sie nur die letzten 30 Tage, aber Fall 2 # ist immer noch da. – Nedim

+0

Warum interessieren Sie sich für die Tage in den letzten 30 Tagen, in denen es keine Aufzeichnungen gibt? – styvane

+0

Weil ich das auf dem Graphen zeigen muss. – Nedim

Antwort

0

So erhalten Sie tägliche Zählimpulse (das übliche Idiom für Zeilenzählung ist {$sum: 1}).

Sie können jedoch keine Nullen für Tage erhalten, an denen Daten fehlen - weil es keine Daten gibt, die den Gruppierungsschlüssel für diese Tage liefern würden. Sie müssen diese Fälle in PHP behandeln, indem Sie eine Liste der gewünschten Daten generieren und dann prüfen, ob für jedes Datum Daten vorhanden sind.

db.getCollection('customer').aggregate([ 
    {$match : { IDproject : 53}},  
    {$group: { 
     _id: {year: {$year: "$dc"}, month: {$month: "$dc"}, day: {$dayOfMonth: "$dc"}}}, 
     total: {$sum: 1} 
    }}, 
]); 

Beachten Sie, dass MongoDB nur in der UTC-Zeitzone arbeitet; Es gibt keine Aggregationspipeline-Operatoren, die Zeitstempel zuverlässig in lokale Zeitzonen konvertieren können. Die Operatoren $year, $month und $dayOfMonth geben das Datum in UTC an, das nicht mit dem in der lokalen Zeitzone übereinstimmt. Die Lösungen umfassen:

  1. Zeitstempel in der lokalen Zeitzone speichern (= zu MongoDB liegt, dass sie in UTC sind),
  2. die Zeitzone mit der Zeitstempel-Offset zu speichern,
  3. den lokalen Jahr, Monat und TagDesMonats Einsparung mit der Zeitstempel.