MongoDB-使用另一个子数组字段更新父数组字段

MongoDB-使用另一个子数组字段更新父数组字段,mongodb,Mongodb,我有这样的收藏 db.aa1.insertMany([ { parentArr: [] }, { parentArr: [ {childArr: [ {childField: 2}, {childField: 4} ]} ] }, { parentArr: [ {childArr: []} ] }, { parentArr: [ {childArr: [ {childField: 3}, {child

我有这样的收藏

db.aa1.insertMany([
    { parentArr: [] },
    { parentArr: [
        {childArr: [ {childField: 2}, {childField: 4} ]}
    ] },
    { parentArr: [
        {childArr: []}
    ] },
    { parentArr: [
        {childArr: [ {childField: 3}, {childField: 5} ]}
    ] },
])
parentArr.forEach(p => p.parentField = p.childArr ? p.childArr.map(c => c.childField) : [])
现在我希望最终结果是这样的

[
    { parentArr: [] },
    { parentArr: [ { childArr: [] } ] },
    { parentArr: [
        { 
          childArr: [ {childField: 2}, {childField: 4} ],
          parentField: [2, 4]
        },
    ] },
    { parentArr: [
        { 
          childArr: [ {childField: 3}, {childField: 5} ],
          parentField: [3, 5]
        }
    ] },
]
在这里,我复制了parentArr.parentField中的childArr.childField值

现在在普通JS中,我可以做这样的事情

db.aa1.insertMany([
    { parentArr: [] },
    { parentArr: [
        {childArr: [ {childField: 2}, {childField: 4} ]}
    ] },
    { parentArr: [
        {childArr: []}
    ] },
    { parentArr: [
        {childArr: [ {childField: 3}, {childField: 5} ]}
    ] },
])
parentArr.forEach(p => p.parentField = p.childArr ? p.childArr.map(c => c.childField) : [])
如何使用MongoDB查询实现这一点

我尝试了以下$push$集合组合,当然,一次一个

出于示例的考虑,我已经编写了所有push和set

db.myCollection.update(
    {
        "parentArr.childArr.0": {$exists: true}
    }, 
    {
        $set: {"parentArr.$[].parentField": ["$parentArr.$[].childArr.$[].childField"]}

        $set: {"parentArr.parentField": ["$parentArr.childArr.childField"]}

        $push: {
            "parentArr.$[].parentField": {$each: ["$parentArr.$[].childArr.$[].childField"]}
        }

        $push: {
            "parentArr.parentField": {$each: ["$parentArr.childArr.childField"]}
        }
    },
    {
        upsert: true,
        multi: true
    }
)

如果您使用的是Mongo 4.2+版,他们引入了这一功能,这意味着我们现在在更新时拥有更强大的功能:

db.aa1.updateMany(
    {
        "parentArr.childArr.childField": {$exists: true}
    },
    [
        {
            $set: {
                "parentArr.parentField": {
                    $reduce: {
                        input: {
                            $map: {
                                input: "$parentArr",
                                as: "parent",
                                in: {
                                    $map: {
                                        input: "$$parent.childArr",
                                        as: "child",
                                        in: "$$child.childField"
                                    }
                                }
                            }
                        },
                        initialValue: [],
                        in: {$setUnion: ["$$value", "$$this"]}
                    }
                }
            }
        }
    ]
)
如果您使用的是较旧的Mongo版本,那么您必须在代码中完成,因为您已经发布了一个相关的代码片段,我没有更多要添加