2014-01-09 13 views
5

Die Struktur ist die folgende:Gruppe von Subdokument Feld mit Aggregation Rahmen

{ 
    "_id" : "79f00e2f-5ff6-42e9-a341-3d50410168de", 
    "bookings" : [ 
     { 
      "name" : "name1", 
      "email" : "[email protected]", 
      "startDate" : ISODate("2013-12-31T22:00:00Z"), 
      "endDate" : ISODate("2014-01-09T22:00:00Z") 
     }, 
     { 
      "name" : "name2", 
      "email" : "[email protected]", 
      "startDate" : ISODate("2014-01-19T22:00:00Z"), 
      "endDate" : ISODate("2014-01-24T22:00:00Z") 
     } 
    ], 
    "name" : "Hotel0", 
    "price" : 0, 
    "rating" : 2 
} 

Nun möchte ich einen Bericht erstellen mir zu sagen, wie viele Buchungen vorgenommen wurden, gruppiert nach Monat buchen (unter der Annahme, dass nur Starttermin buchen Angelegenheiten) und gruppiert auch durch Hotelbewertung.

Ich erwarte, dass die Antwort so sein:

{ 
    { 
     rating: 0, 
     counts: { 
      month1: 10, 
      month2: 20, 
      ... 
      month12: 7 
     } 
    } 
    { 
     rating: 1, 
     counts: { 
      month1: 5, 
      month2: 8, 
      ... 
      month12: 9 
     } 
    } 
    ... 
    { 
     rating: 6, 
     counts: { 
      month1: 22, 
      month2: 23, 
      ... 
      month12: 24 
     } 
    } 
} 

Ich habe versucht, dies mit Aggregation Rahmen, aber ich bin ein wenig stecken.

Antwort

11

Die folgende Abfrage:

db.book.aggregate([ 
    { $unwind: '$bookings' }, 
    { $project: { bookings: 1, rating: 1, month: { $month: '$bookings.startDate' } } }, 
    { $group: { _id: { rating: '$rating', month: '$month' }, count: { $sum: 1 } } } 
]); 

geben Sie das Ergebnis pro Bewertung/Monat, aber es ist kein Subdokument für Monate machen. Im Allgemeinen können Sie einen Wert (z. B. den Monat nr) nicht in einen Schlüssel (z. B. month1) umwandeln. Dies können Sie jedoch in Ihrer Anwendung wahrscheinlich recht einfach handhaben.

Die obige Aggregation ergibt:

"result" : [ 
    { 
     "_id" : { 
      "rating" : 2, 
      "month" : 1 
     }, 
     "count" : 1 
    }, 
    { 
     "_id" : { 
      "rating" : 2, 
      "month" : 12 
     }, 
     "count" : 1 
    } 
], 
"ok" : 1 
Verwandte Themen