2017-03-08 2 views
-1

Ich habe viele Dokumente in einer MongoDB-Datenbank, die wie die folgenden vier Dokumente aussehen (beachten Sie die ersten 3 Februar 2017 und die letzte ist März 2017):MongoDB Aggregation: Gruppieren von Daten innerhalb Datum Gruppen

{"_id": 0, 
"date": ISODate("2017-02-01T00:00:00Z), 
"item": "Basketball", 
"category": "Sports"} 

{"_id": 1, 
"date": ISODate("2017-02-13T00:00:00Z), 
"item": "Football", 
"category": "Sports"} 

{"_id": 2, 
"date": ISODate("2017-02-22T00:00:00Z), 
"item": "Massage", 
"category": "Leisure"} 

{"_id": 3, 
"date": ISODate("2017-03-05T00:00:00Z), 
"item": "Golf club", 
"category": "Sports"} 

Ich versuche, die Elemente nach MONTH/YEAR zu gruppieren und gruppiere die Elemente nach KATEGORIE. So ist die Aggregation Pipeline sollte etwas zurückgeben, die oben für die vier Dokumente wie folgt aussehen:

{"_id": { 
    "month": 2, 
    "year": 2017 
    }, 
"data": [ 
    {"category": "Sports", 
    "items": ["Basketball", "Football"] 
    }, 
    {"category": "Leisure", 
    "items": ["Massage"] 
    } 
] 
}, 
{"_id": { 
    "month": 3, 
    "year": 2017 
    }, 
"data": [ 
    {"category": "Sports", 
    "items": ["Golf Club"] 
    } 
] 
} 

Ich mag auch die zurück Cursor mit Jahr als primäre Art und Monat als sekundäre Sortier in Ordnung sein.

Antwort

0

Ich habe es herausgefunden. Hier ist die Antwort mit dem Pymongo api:

from bson.son import SON 

cursor = db.collection.aggregate([ 
    {'$group': { 
    '_id': {'month': {'$month': '$date'}, 
      'year': {'$year': '$date'}, 
      '$category': '$category'}, 
    'items': {'$push': '$item'} 
    }}, 
    {'$group': { 
    '_id': {'month': '_id.month', 
      'year': '_id.year'} 
    'data': { 
     '$push': { 
     'category': '$_id.category', 
     'items': '$items' 
     } 
    } 
    }}, 
    {'$sort': SON([('_id.year', 1), ('_id.month', 1)])} 
]) 
my_data = list(cursor) 
Verwandte Themen