【问题标题】:Mongo Aggregate Combine Two DocumentsMongodb聚合合并两个文档
【发布时间】:2020-04-16 09:41:52
【问题描述】:

展开子文档数组后,如何将其与所有原始根字段重新组合在一起?

考虑以下任务数据集:

[
    {
        "_id": "5e95bb1cf36c0ab3247036bd",
        "name": "Task A",
        "org": "5e95b9894a0aa0b30dfcbc0b",
        "creator": "5e117e5cd90de7187b000d87"
    },
    {
        "_id": "5e95bb30f36c0ab3247036be",
        "name": "Task B1",
        "org": "5e95b9894a0aa0b30dfcbc0b",
        "creator": "5e117e5cd90de7187b000d87",
        "parent": "5e95bb1cf36c0ab3247036bd"
    },
    {
        "_id": "5e95bb35f36c0ab3247036bf",
        "name": "Task B2",
        "org": "5e95b9894a0aa0b30dfcbc0b",
        "creator": "5e117e5cd90de7187b000d87",
        "parent": "5e95bb1cf36c0ab3247036bd"
    }
]

所以,然后我运行 $graphLookup 来获取父任务并填充它的子任务,然后 $unwind 它并填充 creator 字段:

[
    {
        "$match": {
            "parent": {
                "$exists": false
            }
        }
    },
    {
        "$graphLookup": {
            "from": "tasks",
            "startWith": "$_id",
            "connectFromField": "_id",
            "connectToField": "parent",
            "as": "children"
        }
    },
    {
        "$unwind": {
            "path": "$children"
        }
    },
    {
        "$lookup": {
            "from": "users",
            "localField": "children.creator",
            "foreignField": "_id",
            "as": "children.creator"
        }
    },
    {
        "$unwind": {
            "path": "$children.creator"
        }
    }
]

返回以下文档:

[
    {
        "_id": "5e95bb1cf36c0ab3247036bd",
        "name": "Task A",
        "org": "5e95b9894a0aa0b30dfcbc0b",
        "creator": "5e117e5cd90de7187b000d87",
        "children": [
            {
                "_id": "5e95bb30f36c0ab3247036be",
                "name": "Task B1",
                "org": "5e95b9894a0aa0b30dfcbc0b",
                "creator": {
                    "name": "Jack Frost"
                },
                "parent": "5e95bb1cf36c0ab3247036bd"
            }
        ]
    },
    {
        "_id": "5e95bb1cf36c0ab3247036bd",
        "name": "Task A",
        "org": "5e95b9894a0aa0b30dfcbc0b",
        "creator": "5e117e5cd90de7187b000d87",
        "children": [
            {
                "_id": "5e95bb35f36c0ab3247036bf",
                "name": "Task B2",
                "org": "5e95b9894a0aa0b30dfcbc0b",
                "creator": {
                    "name": "Bill Nye"
                },
                "parent": "5e95bb1cf36c0ab3247036bd"
            }
        ]
    },
]

最后,我需要将所有这些重复的文档重新合并在一起并加入$children。这是我想不通的部分。下面是我正在尝试的一些垃圾,但必须专门列出每个属性似乎很混乱。

有没有更好的方法来组合多个(大部分)匹配的文档?

[
    ...
    {
        "$group": {
            "_id": "$_id",
            "name": {
                "$mergeObjects": "$properties"
            },
            "watchers": {
                "$addToSet": "$watchers"
            },
            "assignees": {
                "$addToSet": "$assignees"
            },
            "org": {
                "$addToSet": "$$ROOT.org"
            },
            "children": {
                "$push": "$children"
            }
        }
    }
]

【问题讨论】:

    标签: mongodb aggregate


    【解决方案1】:

    在这里回答我自己的问题,我能找到的最佳解决方案是指定每个属性,但将其传递给 $first 运算符。这将确保原始值将被传递。

    {
        $group: {
            _id: '$_id',
            name: {$first: '$name'},
            org: {$first: '$org'},
            creator: {$first: '$creator'},
            children: {$push: '$children'} 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2017-03-18
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多