mongodb - 使用聚合框架按子文档字段分组

结构如下:

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

现在,我想生成一份报告,告诉我进行了多少预订,按预订月份分组(假设只有预订开始日期很重要),还按酒店评级分组。

我希望答案是这样的:

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

我用聚合框架试过这个,但我有点卡住了。

最佳答案

以下查询:

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

将为您提供每个评级/月的结果,但它不会在几个月内制作子文档。通常,您无法将值(例如月份 nr)转换为键(例如月份 1)——不过,您可以在应用程序中轻松处理这一点。

以上聚合结果:

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

https://stackoverflow.com/questions/21025446/

相关文章:

python - 有人知道 pymongo 中 2dsphere 索引的工作示例吗?

mongodb - 在 mongo shell 中加载和运行聚合

python - Mongodb复制集自动重新连接在nginx + uwsgi上下运行后无法正常工作

mongodb - NoSQL 与关系数据库与可能的混合

mongodb - 结合 Neo4J 和 MongoDB : Consistency

javascript - 在 MongoDB 更新语句中使用变量

node.js - 是否可以将额外的参数传递给 Mongoose 更新回调

java - MongoDB Java 驱动程序 : distinct with sort

node.js - NodeJS ExpressJS PassportJS - 仅用于管理页面

c# - 使用 MongoDB 的 C# 驱动程序进行多字段查询