중첩 조회가있는 Mongodb 집계 복잡한 문서
Aug 19 2020
다음 컬렉션이 있습니다.
사이트
{
_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를 풀어야했습니다 . 원하는 방식으로 배열을 얻을 수있는 방법을 찾지 못했습니다. 그룹을 시도했지만 하위 배열에 문제가 있습니다. 이것이 필요한 결과를 얻는 가장 좋은 방법인지 확실하지 않습니다.
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"
}
}
]
);
답변
1 varman Aug 19 2020 at 00:21
$unwind
두 번 했으므로 두 번 사용해야 $group
합니다.
{
$group: { _id: { secId: "$_id",
fId: "$Sections.id" }, Type: { $first: "$Type" }, Name: { $first: "$Name" }, Header: { $first: "$Sections.Header" }, fieldItems: { $push: "$Sections.FieldItems" } } }, { $group: {
_id: "$_id.secId", Type: { $first: "$Type" }, Name: { $first: "$Name" }, Sections: { $push: {
id: "$_id.fId", Header: "$Header",
fieldItems: "$fieldItems"
}
}
}
}
- 첫 번째 그룹-하위 개체를 그룹화합니다. 그러나 유형, 이름 및 헤더 는 각각 부모 및 자식 배열로 설정해야합니다.
- 두 번째 그룹-상위 개체를 그룹화합니다. 자식을 그룹화하는 동안 모든 독립형 필드를 얻습니다. 여기서 우리는 올바른 순서대로 설정해야합니다.
일하는 몽고 놀이터
참고 :을 사용 $lookup
하면 배열이 제공됩니다. 하지만 그냥 물건으로 만드는 곳이 있습니다. 나는 당신이 일대일 관계에 참여하는지 여부를 모릅니다. 그렇다면 투영 또는 배열 에서 위치 연산자를 사용할 수 있습니다.