MongoDB聚合:查找数组子对象
我有以下格式的记录集 学生MongoDB聚合:查找数组子对象,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有以下格式的记录集 学生 [ { "name" : "student A", "type" : 1, "results" : [ { "position" : 1, "percent" : 90, "test_id" : ObjectId("aaaa") }, {
[
{
"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”
我已经尝试过聚合、放松和项目的各种组合,但仍然无法达到目的,非常感谢您的建议。此管道应该适合您:
[{
$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"
}
}
}]
以下是您的管道截图,您可以看到每个阶段发生的情况:
如果您想去掉额外的字段,可以添加一个项目阶段。您提供的数据与要求不匹配。你能纠正你的要求和输入数据吗。我怀疑您需要
Test.name=“学生A”
[{
$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"
}
}
}]