【问题标题】:mongodb aggregation - unwind/group/project query combinationmongodb聚合-展开/分组/项目查询组合
【发布时间】:2016-10-22 21:38:04
【问题描述】:

我有以下格式的记录。

//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”字段包含重复值。我需要通过添加各自的“时间”来对 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
                            }                                
                    ]      
            }
}

我尝试了聚合、组、展开和项目的各种组合,但仍然无法达到目标,非常感谢任何建议。

【问题讨论】:

  • 你想以什么结尾?对于每个分析 ID,您是尝试将“时间”与“pageNo”相加,还是将“时间”与“pageNo”相加?
  • 我想用“pageNo”对“时间”求和。
  • 我想要这样的东西。 analyticsID1 -> { timeSpent : [ { time : 10, pageNo: 1 },..] }, analyticsID2 -> { timeSpent : [ { time : 20, pageNo: 1 },..] }

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation


【解决方案1】:

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

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)
    }]
}]

【讨论】:

  • 这包括输出中每个文档的标题,并按照您在上述评论中要求的方式对其进行格式化。如果您希望输出有所不同,请告诉我,我会更新汇总。
  • 感谢您制定解决方案。效果很好。我正在考虑您关于将数据结构化为展开的第二阶段然后分组的建议,这将需要大量的内存和时间。