programing

MongoDB 중첩 문서 $lookup

instargram 2023. 6. 21. 22:09
반응형

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

반응형