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版本,那么您必须在代码中完成,因为您已经发布了一个相关的代码片段,我没有更多要添加