Группировка по полю вложенного документа с использованием структуры агрегации

Структура следующая:

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

Теперь я хочу создать отчет о том, сколько бронирований было сделано, сгруппированных по месяцам бронирования (предположим, что имеет значение только дата начала бронирования), а также сгруппированных по рейтингу отелей.

Я ожидаю, что ответ будет таким:

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

Я пробовал это с фреймворком агрегации, но я немного застрял.


person grozandrei    schedule 09.01.2014    source источник


Ответы (1)


Следующий запрос:

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

Выдаст вам результат по рейтингу/месяц, но не делает поддокумент по месяцам. В общем, вы не можете преобразовать значение (например, номер месяца) в ключ (например, month1) — хотя это то, что вы, вероятно, легко сможете обработать в своем приложении.

Вышеупомянутая агрегация приводит к:

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