MongoDB:如何为聚合管道中的数组元素分配索引名称?

时间:2017-02-17 21:57:32

标签: mongodb aggregation-framework

这是我在长时间聚合后得到的数组。

  "stages": [
     [
        {
           "id": "58a6678bc27c331884b60930",
           "description": "Lorem ipsum dolor sit amet...",
           "somevalue": 0,
           "user": "589cf6511b94281f34617a13"
        },
        {
           "_id": "589cf6511b94281f34617a13",
           "title": "Dr.",
           "firstname": "Doe",
           "lastname": "John"
        }
     ]
  ]

如您所见,现在我有一堆彼此嵌套的数组。有没有办法统一数组中的两个集合或给它们正确的索引名称?

可能的解决方案#1就是这个。内部阵列消失了,这些集合也是统一的。

  "stages": [
        {
           "id": "58a6678bc27c331884b60930",
           "description": "Lorem ipsum dolor sit amet...",
           "somevalue": 0,
           "user": "589cf6511b94281f34617a13"
           "_id": "589cf6511b94281f34617a13",
           "title": "Dr.",
           "firstname": "Doe",
           "lastname": "John"
        }
  ]

可能的解决方案#2:数组没有消失,但至少元素现在有索引名称,我不必将它们称为[0]和[1]。

  "stages": [
     [
        "stage": {
           "id": "58a6678bc27c331884b60930",
           "description": "Lorem ipsum dolor sit amet...",
           "somevalue": 0,
           "user": "589cf6511b94281f34617a13"
        },

        "user": {
           "_id": "589cf6511b94281f34617a13",
           "title": "Dr.",
           "firstname": "Doe",
           "lastname": "John"
        }
     ]
  ]

任何有解决方案的人都可以使用虚拟Cookie ...

汇总代码

db.collection('bugs').aggregate([{
                $match: new ObjectId()
            }, {
                $lookup: {
                    from: 'users',
                    localField: 'user',
                    foreignField: '_id',
                    as: 'userdata'
                }
            },

            {
                $unwind: '$userdata'
            },

            {
                $sort: {
                    'stages.date': -1
                }
            },

            {
                $unwind: '$stages'
            }, {
                $lookup: {
                    from: 'users',
                    localField: 'stages.user',
                    foreignField: '_id',
                    as: 'stages_users'
                }
            },

            {
                $unwind: '$stages_users'
            }, {
                $unwind: '$stages'
            },

            {
                $group: {
                    '_id': '$_id',
                    'title': {
                        $first: '$title'
                    },
                    'user': {
                        $first: '$user'
                    },
                    'browser': {
                        $first: '$browser'
                    },
                    'severity': {
                        $first: '$severity'
                    },
                    'data': {
                        $first: '$data'
                    },
                    'userdata': {
                        $first: '$userdata'
                    },
                    'stages': {
                        $addToSet: {
                            $setUnion: [
                                ['$stages_users'],
                                ['$stages']
                            ]
                        }
                    }
                }
            },

            {
                $project: {

                    '_id': 1,
                    'user': 1,
                    'title': 1,
                    'browser': 1,
                    'date': 1,
                    'severity': 1,

                    'userdata._id': 1,
                    'userdata.title': 1,
                    'userdata.firstname': 1,
                    'userdata.lastname': 1,

                    'stages._id': 1,
                    'stages.id': 1,
                    'stages.user': 1,
                    'stages.date': 1,
                    'stages.description': 1,
                    'stages.severity': 1,
                    'stages.previous_severity': 1,
                    'stages.files': 1,

                    'stages.title': 1,
                    'stages.firstname': 1,
                    'stages.lastname': 1
                }
            }
        ],

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。

因此,这里的想法是在stages阶段stage_users之后将stages_merge_users$lookup中的字段合并到$project文档中。

我已经从stagesstage_users添加了字段以进行演示。

您必须从两个文档中一次添加一个字段,最后一个阶段将$group阶段重新添加到一起。

db.bugs.aggregate([{
    $lookup: {
        from: 'users',
        localField: 'user',
        foreignField: '_id',
        as: 'userdata'
    }
}, {
    $unwind: '$stages'
}, {
    $lookup: {
        from: 'users',
        localField: 'stages.user',
        foreignField: '_id',
        as: 'stages_users'
    }
}, {
    $unwind: '$stages_users'
}, {
    $project: {
        '_id': 1,
        'user': 1,
        'title': 1,
        'browser': 1,
        'date': 1,
        'severity': 1,
        'userdata': 1,
        "stages_merge_users.firstname": "$stages_users.firstname",
        "stages_merge_users.user": "$stages.user"
    }
}, {
    $group: {
        '_id': '$_id',
        'title': {
            $first: '$title'
        },
        'user': {
            $first: '$user'
        },
        'browser': {
            $first: '$browser'
        },
        'severity': {
            $first: '$severity'
        },
        'data': {
            $first: '$data'
        },
        'userdata': {
            $first: '$userdata'
        },
        'stages': {
            $push: '$stages_merge_users'

        }
    }
}])

版本3.4更新

您可以将$project阶段替换为$addFields。此阶段将字段添加到现有字段。

{$addFields: {  "stages_merge_users.firstname":"$stages_users.firstname", "stages_merge_users.user_id":"$stages.user_id"}},