mongodb聚合-unwind/group/project查询组合

mongodb aggregation - unwind/group/project query combination

我有以下格式的记录。

//One parent record
{
    "_id" : "someDocID",
    "title" : "some title",
    "analytics" : [
            {
                    "_id" : "analyticsID1", 
                   "timeSpent" : [
                            {
                                    "time" : 14,
                                    "pageNo" : 1
                            },
                            {
                                    "time" : 4,
                                    "pageNo" : 2
                            },
                            {
                                    "time" : 3,
                                    "pageNo" : 1
                            },
                            {
                                    "time" : 1,
                                    "pageNo" : 2
                            }
                    ]                       

            },
            {                        
                    "_id" : "analyticsID2",                        
                    "timeSpent" : [
                            {
                                    "time" : 12,
                                    "pageNo" : 10
                            },
                            {
                                    "time" : 15,
                                    "pageNo" : 11
                            },
                            {
                                    "time" : 26,
                                    "pageNo" : 12
                            },
                            {
                                    "time" : 13,
                                    "pageNo" : 11
                            },
                            {
                                    "time" : 17,
                                    "pageNo" : 10
                            },
                            {
                                    "time" : 30,
                                    "pageNo" : 11
                            }
                    ]
            }
    ]               
}

"pageNo" 字段包含重复值。我需要通过添加各自的 "time".

对 pageNo 字段进行分组

这是我需要的输出。 (在对分析进行“$unwind”操作之后)

//Two records after "$unwind" on analytics
{
    "_id" : "someDocID",
    "title" : "some title",
    "analytics" : {
                    "_id" : "analyticsID1", 
                    "timeSpent" : [
                            {
                                    "time" : 17,   //14+3
                                    "pageNo" : 1
                            },
                            {
                                    "time" : 5,    //4+1
                                    "pageNo" : 2
                            }
                    ]
            }
}

{
    "_id" : "someDocID",
    "title" : "some title",
    "analytics" : {
                    "_id" : "analyticsID2", 
                    "timeSpent" : [
                            {
                                    "time" : 29,    //12+17
                                    "pageNo" : 10
                            },
                            {
                                    "time" : 58,    //15+13+30
                                    "pageNo" : 11
                            },
                            {
                                    "time" : 26,
                                    "pageNo" : 12
                            }                                
                    ]      
            }
}

我已经尝试了聚合、组、放松和项目的各种组合,但仍然无法完全实现,非常感谢任何建议。

这是我想出的一个集合,用于提供您在上面的评论中提到的输出。仅供参考,数组中需要展开的元素越多,您使用的内存就越多,并且根据数组大小,这将花费指数级的时间。如果您的数组长度不受限制,我强烈建议您以不同的方式构建数据。

var aggregrate = [{
    $unwind: '$analytics'
}, {
    $unwind: '$analytics.timeSpent'
}, {
    $group: {
        _id: {
            analytics_id: '$analytics._id',
            pageNo: '$analytics.timeSpent.pageNo'
        },
        title:{$first:'$title'},
        time: {
            $sum: '$analytics.timeSpent.time'
        },
    }
}, {
    $group: {
        _id: '$_id.analytics_id',
        title:{$first:'$title'},
        timeSpent: {
            $push: {
                time: '$time',
                pageNo: '$_id.pageNo'
            }
        }
    }
}, ];

此输出:

[{
    "_id": "analyticsID1",
    "title" : "some title", 
    "timeSpent": [{
        "time": NumberInt(17),
        "pageNo": NumberInt(1)
    }, {
        "time": NumberInt(5),
        "pageNo": NumberInt(2)
    }]
}, {
    "_id": "analyticsID2",
     "title" : "some title", 
     "timeSpent": [{
        "time": NumberInt(26),
        "pageNo": NumberInt(12)
    }, {
        "time": NumberInt(29),
        "pageNo": NumberInt(10)
    }, {
        "time": NumberInt(58),
        "pageNo": NumberInt(11)
    }]
}]