반응형
MongoDB 중첩 문서 $lookup
저는 몽고가 처음이고 다음과 같이 열심히 노력하고 있습니다.아래와 같이 구성된 컬렉션이 2개 있습니다.아무리 해도 학교 소장품에 대한 $ 조회를 어떻게 해야 할지 모르겠어요.다른 게시물들을 읽어보니, 저는 분명히 ObjectId를 참고용으로 사용하고 있고, 외국어 분야도 마찬가지입니다.
제 구조는 다음과 같습니다.
졸업생:
{
"_id": "john",
"items": [
{
"name": "John",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa3d5e4"),
"grad": true
},
{
"school": ObjectId("56de35ab520fc05b2fa00000"),
"grad": false
}
]
},
{
"name": "Johnny"
// notice no nested items, this doc should still be included in result
},
{
"name": "Jon",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa11111"),
"grad": false
}
]
}
]
}
학교
{
_id: ObjectId("56de35ab520fc05b2fa3d5e4"),
name: "Some University",
street: "ABC Boulevard"
}
내가 원하는 것:
{
"_id": "john",
"items": [
{
"name": "John",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa3d5e4"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa3d5e4"),
name: "Some University",
street: "ABC Boulevard"
}
},
{
"school": ObjectId("56de35ab520fc05b2fa00000"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa00000"),
name: "Another University",
street: "123 Boulevard"
}
}
]
},
{
name: "Johnny"
},
{
"name": "Jon",
"items": [
{
"school": ObjectId("56de35ab520fc05b2fa11111"),
"grad": true,
"schoolInfo": {
_id: ObjectId("56de35ab520fc05b2fa11111"),
name: "Some University",
street: "ABC Boulevard"
}
}
]
}
]
}
내가 시도한 질문은 소용이 없습니다.
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}}
])
어떤 도움이라도 주시면 대단히 감사하겠습니다!
이 경우 집계 프레임워크에서 $sigfind와 $project가 있는 멋진 플레이가 필요합니다.
아래를 참조하십시오.
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$unwind:"$items"},
{$unwind:"$items.items"},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}},
{$unwind:"$schoolInfo"},
{$project:{
"_id":1,
"items":[{
"name":"$items.name",
"items":[{
"school":"$schoolInfo._id" ,
"grad":"$items.items.grad" ,
"schoolInfo":"$schoolInfo"
}]
}]
}}
]).pretty()
작동 방식을 확인하려면 - 쿼리에서 집계 단계를 제거하고 문서 구조를 확인합니다.
그것이 여러 학교를 더 잘 다룰 수 있을까요?$items.items
배열?
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$unwind:"$items"},
{$unwind:"$items.items"},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}},
{$unwind:"$schoolInfo"},
{$group:{
_id: {
_id: '$_id',
name: '$items.name',
},
items: {
$push: {
'grad': '$items.items.grad',
'school': '$schoolInfo._id'
'schoolInfo': '$schoolInfo'
}
}
}},
{$group:{
_id: '$_id._id',
items: {
$push: {
'name': '$_id.name',
'items': '$items'
}
}
}}
]).pretty()
실종 사건에 대해서는 언급하지 않았습니다$items.items
그러나 $unwind 빈 배열을 볼 수 있습니다. 추가로, 항목이 없을 때는 아무것도 없는 대신 빈 배열을 남기는 것이 좋습니다.
{
name: "Johnny",
items: [],
},
언급URL : https://stackoverflow.com/questions/36022456/mongodb-lookup-on-nested-document
반응형
'programing' 카테고리의 다른 글
파이어베이스의 FCM 토큰이란 무엇입니까? (0) | 2023.06.21 |
---|---|
고정 너비를 설정하는 방법은 무엇입니까? (0) | 2023.06.21 |
속성을 바인딩할 수 없습니다. (0) | 2023.06.21 |
과부하 특성 라라벨 MongoDB의 간접 수정 (0) | 2023.06.21 |
파일 I/O 속도 향상: mmap() vs read() (0) | 2023.06.21 |