mongodb - Mongodb - 基于特定属性合并嵌套子文档数组
问题描述
我已经建立了一个返回这些数据的聚合:
[
{
"users": [
{
_id: 1,
name: "John",
age: 31
},
{
_id: 2,
name: "Jane",
age: 26
}
],
"teams": [
{
id: 1,
name: "Team 1",
color: "yellow"
},
{
id: 2,
name: "Team 2",
color: "red"
}
],
"moreTeams": [
{
id: 1,
name: "Team 1 - More",
},
{
id: 2,
name: "Team 2 - More",
},
{
id: 3,
name: "Team 3 - More",
extra: "extra"
}
]
}
]
如何将“团队”分组并moreTeams
放入同一个数组(基于 id),保留所有属性并最终覆盖它们具有相同名称的位置?
这是我想要的结果:
[
{
"users": [
{
_id: 1,
name: "John",
age: 31
},
{
_id: 2,
name: "Jane",
age: 26
}
],
"groupedTeams": [
{
id: 1,
name: "Team 1 - More",
color: "yellow"
},
{
id: 2,
name: "Team 2 - More",
color: "red"
},
{
id: 3,
name: "Team 3 - More",
extra: "extra"
}
]
}
]
我试过使用 $unwind 和 $group 没有成功:(
解决方案
$map
moreTeams
迭代数组的循环$filter
迭代数组循环teams
并过滤匹配对象id
$arrayElemAt
从上面的过滤器中获取第一个元素对象$mergeObjects
合并上面的对象arrayElemAt
和当前对象
db.collection.aggregate([
{
$addFields: {
moreTeams: {
$map: {
input: "$moreTeams",
as: "m",
in: {
$mergeObjects: [
{
$arrayElemAt: [
{
$filter: {
input: "$teams",
cond: { $eq: ["$$m.id", "$$this.id"] }
}
},
0
]
},
"$$m"
]
}
}
}
}
},
现在我们已经合并moreTeams
了,teams
但我们也必须teams
合并moreTeams
$project
,$filter
迭代数组循环teams
并匹配条件(如果id
不在)moreTeams
$concatArrays
连接moreTeams
及以上过滤后的数组moreTeams
{
$project: {
users: 1,
moreTeams: {
$concatArrays: [
"$moreTeams",
{
$filter: {
input: "$teams",
cond: { $not: { $in: ["$$this.id", "$moreTeams.id"] } }
}
}
]
}
}
}
])
推荐阅读
- jenkins - 在 Jenkinsfile 的环境变量中使用 git 分支
- swift - swift中集合类型的哈希值是什么?
- sql - 在组集中选择一条没有特定任务的记录
- kernel - 开发人员如何识别他们的操作系统内核类型?
- html - 让孩子身高100%
- java - 爱普生TM20|| 打印机 阿拉伯语 打印 字形 整形
- visual-studio-code - 如何在 VS Code 中将文件从一台计算机同步/共享到另一台计算机?
- c# - 如何在 Unity AR Foundation 中将 gameObject 附加到 referencePoint?
- c# - 如何在 C# 中使用 InstaSharp 关注用户
- excel - 有没有办法使用 VBA 更改 VBA 生成的工作表中的语言?