MongoDB聚合:对两个数组的公共字段进行分组

时间:2017-12-21 08:57:44

标签: mongodb aggregation-framework

以下是示例文档:

{
    'uid': 1,
    'sent': [
        {
            'mid': 100,
            'date': 20171210,
        },
        {
            'mid': 101,
            'date': 20171210,
        }
    ],
    'open': [
        {
            'mid': 100,
            'date': 20171220,
        },
        {
            'mid': 101,
            'date': 20171220,
        }
    ]
}

我想分组'uid'和嵌套'mid'字段。
我想要的输出是:

{
    'uid': 1,
    'mid': 100,
    'sent': [ 20171210 ],
    'open': [ 20171220 ]
}
{
    'uid': 1,
    'mid': 101,
    'sent': [ 20171210 ],
    'open': [ 20171220 ]
}

是否有任何有效的聚合方式可以给我上述结果?

1 个答案:

答案 0 :(得分:3)

您可以$unwind一个数组,然后使用$filter仅保留第二个数组中的匹配条目。然后$展开第二个数组和$ group。

db.temp.aggregate(
    [
        {
            $unwind: {
                'path': '$sent',
            }
        },
        {
            $project: {
                'uid': 1,
                'sent': 1,
                'open': { $filter: {
                                    input: '$open',
                                    as: 'this',
                                    cond: { $eq: [ '$sent.mid', '$$this.mid' ] }
                               } }

            }
        },
        {
            $unwind: {
                'path': '$open',
            }
        },
        {
            $group: {
                '_id': { 'uid': '$uid', 'mid': '$sent.mid' },
                'sent': { '$push': '$sent.date' },
                'open': { '$push': '$open.date' }
            }
        },
        {
            $project: {
                '_id': 0,
                'uid': '$_id.uid',
                'mid': '$_id.mid',
                'sent': 1,
                'open': 1
            }
        },
    ]
);