MongoDB Aggregation SUM Массив массивов по ключу объекта - PullRequest
0 голосов
/ 31 мая 2018

Хорошо, я некоторое время искал, но не смог найти ответ на этот вопрос, и я в отчаянии: P

У меня есть несколько документов с этим синтаксисом

{
    "period": ISODate("2018-05-29T22:00:00.000+0000"),
    "totalHits": 13982
    "hits": [
        {
            // some fields...
            users: [
                { 
                    // some fields...
                    userId: 1,
                    products: [
                        { productId: 1, price: 30 },
                        { productId: 2, price: 30 },
                        { productId: 3, price: 30 },
                        { productId: 4, price: 30 },
                    ]
                },
            ]
        }
    ]
}

И я хочу получить подсчет того, сколько продуктов (независимо от того, у какого пользователя у них есть) у нас за период, пример вывода будет таким:

[
    {
        "period": ISODate("2018-05-27T22:00:00.000+0000"),
        "count": 432
    },
    {
        "period": ISODate("2018-05-28T22:00:00.000+0000"),
        "count": 442
    },
    {
        "period": ISODate("2018-05-29T22:00:00.000+0000"),
        "count": 519
    }
]

Что сводит меня с ума, так это«объект внутри массива внутри массива» Я сделал много агрегаций, но я думаю, что они были проще, чем этот, поэтому я немного растерялся.

Я думаю об изменении структуры нашего документа в лучшую сторонуодин, но у нас есть ~ 6M документов, которые нам нужно преобразовать в новый, и это просто беспорядок ... но, возможно, это единственное решение.

Мы используем MongoDB 3.2, мы не можем обновитьнаши системы банкоматов (желаю, но не возможно).

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать $unwind для расширения массива, а затем $group для суммирования:

db.test.aggregate([
    {$match: {}}, 
    {$unwind: "$hits"}, 
    {$project: {_id: "$_id", period: "$period", users: "$hits.users"}}, 
    {$unwind: "$users"}, 
    {$project: {_id: "$_id", period: "$period", subCout: {$size: "$users.products"}}}, 
    {$group: {"_id": "$period", "count": {$sum: "$count"}}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...