【发布时间】:2020-08-19 01:21:03
【问题描述】:
我有这些收藏:
网站
{
_id: ObjectId("5acdb8f65ea63a27c1facf86"),
TemplateId: ObjectId("sdfsdfs34234234sdf"),
}
模板
{
_id: ObjectId("sdfsdfs34234234sdf"),
Type: "Site",
Name: "Site 1",
Sections:[{
id: ObjectId("8asdf89asd8f9sdf"),
Header: "Header1",
FieldItems: [
{
FieldId: ObjectId("jsd32423423423"),
x: 1,
y: 0
},
{
FieldId: ObjectId("2342sdffafdasdfdfs"),
x: 1,
y: 1
}
]
},
(...more sections...)
]
}
字段
{
_id: ObjectId("jsd32423423423"),
Type: "Phone",
Name: "Phone_Test"
},
{
_id: ObjectId("2342sdffafdasdfdfs"),
Type: "Numeric",
Name: "Number_Test"
}
我是 MongoDB 新手,但花了几天时间阅读问题和答案以及文档。我正在使用 MongoDB 4.2.6。我正在尝试返回格式如下的结果:
{
id: ObjectId("5acdb8f65ea63a27c1facf86"),
TemplateId: ObjectId("sdfsdfs34234234sdf"),
Template: {
id: ObjectId("sdfsdfs34234234sdf"),
Type: "Site",
Sections:[{
id: ObjectId("8asdf89asd8f9sdf"),
Header: "Header1",
FieldItems: [
{
FieldId: ObjectId("jsd32423423423"),
x: 1,
y: 0,
Field: {
_id: ObjectId("jsd32423423423"),
Type: "Phone",
Name: "Phone_Test"
}
}, (...)]
}]
}
我已经编写了一个带有嵌套查找的聚合查询,以使我大部分时间都在那里,但为了让它工作,我不得不展开 Sections 和 FieldItems。我还没有想出一种方法来让数组达到我想要的方式。我试过 group 但子数组有问题。我什至不确定这是否是获得所需结果的最佳方式:
db.getCollection("AppSites").aggregate(
[
{
"$lookup" : {
"from" : "AppTemplates",
"let": {"template_id": "$TemplateId"},
"pipeline": [
{ "$match": { "$expr": { "$eq" : ["$_id", "$$template_id"] } } },
{ "$unwind": "$Sections"},
{ "$unwind": "$Sections.FieldItems"},
{
"$lookup": {
"from": "AppFields",
"let": {"field_id": "$Sections.FieldItems.FieldId"},
"pipeline": [
{ "$match": { "$expr": { "$eq": ["$_id", "$$field_id"] } } }
],
"as": "Sections.FieldItems.Field"
}
}
],
"as" : "Templates"
}
}
]
);
【问题讨论】:
标签: mongodb