MongoDB聚合:对日期组内的数据进行分组

时间:2017-03-08 21:43:07

标签: mongodb aggregation-framework pymongo

我在MongoDB数据库中有很多文档,看起来像以下四个文件(注意前3个是2017年2月,最后一个是2017年3月):

{"_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"}

我试图按MONTH / YEAR对项目进行分组,然后在其中按CATEGORY对项目进行分组。因此聚合管道应该返回上面四个文档的内容:

{"_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"]
   }
 ]
}

我还希望返回的游标按顺序排列,其中year作为主要排序,月份作为辅助排序。

1 个答案:

答案 0 :(得分:1)

想出来。这是使用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)