如何在MongoDB中实现分组和统计查询?

在MongoDB中,可以使用聚合管道(Aggregation Pipeline)对数据进行分组和统计查询。聚合管道是一个由多个阶段(Stage)组成的数据处理管道,每个阶段都可以对输入文档进行处理,输出结果作为下一个阶段的输入。

下面是一个示例,展示如何使用聚合管道对集合中的数据进行分组和统计查询:

假设我们有一个集合,包含以下文档:

{
    "_id": 1,
    "item": "apple",
    "price": 0.5,
    "quantity": 10,
    "date": ISODate("2023-03-21T00:00:00Z")
}
{
    "_id": 2,
    "item": "banana",
    "price": 0.25,
    "quantity": 20,
    "date": ISODate("2023-03-21T00:00:00Z")
}
{
    "_id": 3,
    "item": "pear",
    "price": 0.4,
    "quantity": 15,
    "date": ISODate("2023-03-20T00:00:00Z")
}

要按日期分组,并计算每个日期的总销售额和平均销售额,可以使用以下聚合管道:

db.sales.aggregate([
    { $match: { date: { $gte: ISODate("2023-03-20T00:00:00Z") } } },
    { $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, total_sales: { $sum: { $multiply: [ "$price", "$quantity" ] } }, average_sales: { $avg: { $multiply: [ "$price", "$quantity" ] } } } }
])

该聚合管道包括两个阶段。第一个阶段使用$match操作符筛选出日期在2023年3月20日及以后的文档。第二个阶段使用$group操作符按日期进行分组,并计算每个日期的总销售额和平均销售额。最终的结果类似于:

{ "_id" : "2023-03-21", "total_sales" : 12.5, "average_sales" : 0.375 }
{ "_id" : "2023-03-20", "total_sales" : 6, "average_sales" : 0.4 }