按对象键的MongoDB聚合SUM数组数组

时间:2018-05-31 11:14:06

标签: mongodb

好的,所以我一直在寻找一段时间,却找不到答案,我很绝望: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,我们无法更新我们的系统atm(我希望,但不可能)。

1 个答案:

答案 0 :(得分:1)

您可以使用$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"}}}
])