mongodb - MongoDB聚合:查找数组子对象
问题描述
我有以下格式的记录。
学生
[
{
"name" : "student A",
"type" : 1,
"results" : [
{
"position" : 1,
"percent" : 90,
"test_id" : ObjectId("aaaa")
},
{
"position" : 2,
"percent" : 88,
"test_id" : ObjectId("bbbb")
}
]
},
{
"name" : "student B",
"type" : 1,
"results" : [
{
"position" : 2,
"percent" : 56,
"test_id" : ObjectId("bbbb")
}
]
}
]
测试:
{
"_id" : ObjectId("aaaa"),
"name" : "Test A",
},
{
"_id" : ObjectId("bbbb"),
"name" : "Test B",
}
这是我需要的输出,条件:Test.name = "Test A"
[
{
"name" : "student A",
"type" : 1,
"results" : [
{
"position" : 1,
"percent" : 90,
"test" : {
"_id" : ObjectId("aaaa"),
"name" : "Test A",
}
},
{
"position" : 2,
"percent" : 88,
"test" : {
"_id" : ObjectId("bbbb"),
"name" : "Test B",
}
}
]
}
]
我已经尝试了聚合、展开和项目的各种组合,但仍然无法达到目标,并且非常感谢任何建议。
解决方案
该管道应该适合您:
[{
$match: {
name: "student A"
}
}, {
$unwind: {
path: "$results"
}
}, {
$lookup: {
from: 'TEST',
localField: 'results.test_id',
foreignField: '_id',
as: 'results.test'
}
}, {
$group: {
_id: "$name",
name: {
$first: "$name"
},
type: {
$first: "$type"
},
results: {
$push: "$results"
}
}
}]
如果您想摆脱额外的字段,您可以添加一个项目阶段。
推荐阅读
- django - 删除图像字段和 upload_to_path 方法后迁移出错
- android-studio - 如何在 Kotlin 中返回两个值?
- python - 另一个 json / python dict 问题 - 如何重新排列字典的子集
- python - 将 pandas 数据帧自动导入 MySQL
- delphi - 为什么使用 Indy TCP 服务器-客户端传输时无法获得超过 20% 的带宽?
- python - pip install 找不到包,但 pip search 可以
- matlab - 如何从 Matlab 矩阵中提取一列?
- android - 如何使用导航架构组件处理 BottomNavBar 菜单侦听器
- gantt-chart - 甘特图未显示正确日期
- django - 使用 django cms 显示子菜单