MongoDB按对象键聚合数组的总和数组

MongoDB按对象键聚合数组的总和数组,mongodb,Mongodb,好吧,我已经搜索了一段时间,但找不到答案,我绝望了:p 我有一些使用这种语法的文档 { "period": ISODate("2018-05-29T22:00:00.000+0000"), "totalHits": 13982 "hits": [ { // some fields... users: [ { // some fields

好吧,我已经搜索了一段时间,但找不到答案,我绝望了: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
    }
]
让我抓狂的是数组中的对象数组中的对象我做了很多聚合,但我认为它们比这个简单,所以我有点迷茫

我正在考虑将我们的文档结构更改为更好的文档结构,但我们有大约600万个文档需要转换为新的文档,这简直是一团糟。。。但也许这是唯一的解决办法

我们使用的是MongoDB 3.2,我们无法更新我们的系统,但这是不可能的。

您可以使用$unwind扩展阵列,然后使用$group求和:


如果您想要每个用户id,那么除了$unwind每个数组(无论版本如何)之外,没有其他选项。更新的版本在这里对您没有任何帮助,而问题似乎更多的是嵌套数组,您应该有一个更平坦的结构。我已经读过“展开”对于大型集合不是最佳选择,无论如何,它需要超低的计数,我需要检查结果,但它给我的结果比我尝试过的聚合更好,一旦我们测试了东西,我会给你我的反馈,但看起来很有希望:D我会把这个aggr刻在我的大脑上看起来它是对所有产品的总和,而不仅仅是那些与ID匹配的产品,例如在我们的旧数据中,我们对一个产品的计数是180,通过这个查询,我得到了8641,这是非常巨大的,看起来像每个产品的总和,因为我们的库存等。我尝试了$filter,但我不是很好,所以什么也没做:P sum总是0你必须把你的过滤器放在这里{$match:{},并根据你的需要定制。如果您想要特定的产品,请在每个投影后放置一个$match。是的,我将我的过滤器放置在该匹配中,{hits.users.products.productId:1}我认为$sum$大小是个问题,因为products数组的大小不仅包含一个产品,还包含一组产品,我认为如果文档中包含该产品,它会计算数组的大小,而不是在每次精确的产品内部命中时计算+1。我想,我现在要走了,明天早上我会再次检查^^
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"}}}
])