MongoDB

MongoDB로 Join하기

ZzangHo 2022. 1. 27. 17:45
728x90

MongoDB로 Join을 해보자

 

먼저, MongoDB의 경우 NoSQL로 Join을 지원하지 않는다.

그렇지만 MongoDB 3.2부터는 비슷한 기능인 $lookup 기능을 지원하고 있다.

 

db.getCollection('기준_컬렉션').aggregate([
    { 
        $lookup:
        {
            from: "조인할 컬렉션",
            localField: "기준 컬렉션 필드",
            foreignField: "조인할 컬렉션의 필드",
            as: "조인 된 데이터가 생성될 신규 필드명"
        }
    }
    ,{ $out : "신규로 생성 될 컬렉션명" }
])

 

위와 같이 쿼리를 입력하여 실행하면 Embedded document 형태로 생성 된다.

 

실행

[person]

/* 1 */
{
    "_id" : ObjectId("61f25a65b8edc7891f89778c"),
    "name" : "lee chang ho",
    "age" : "33",
    "team" : 1
}

/* 2 */
{
    "_id" : ObjectId("61f25a80b8edc7891f897ac8"),
    "name" : "kim chul su",
    "age" : "30",
    "team" : 1
}

/* 3 */
{
    "_id" : ObjectId("61f25a8db8edc7891f897c3e"),
    "name" : "sunja",
    "age" : "23",
    "team" : 2
}

 

[team]

/* 1 */
{
    "_id" : ObjectId("61f25aa8b8edc7891f897f63"),
    "name" : "search team",
    "num" : 1
}

/* 2 */
{
    "_id" : ObjectId("61f25ab0b8edc7891f898033"),
    "name" : "data team",
    "num" : 2
}

 

JOIN QUERY

db.getCollection('team').aggregate([
    { 
        $lookup:
        {
            from: "person",
            localField: "num",
            foreignField: "team",
            as: "join_field"
        }
    },
    {
        $match: {
            "join_field": {$ne: []}
        }
    }
    ,{ $out : "view_test" }
])

 

결과

/* 1 */
{
    "_id" : ObjectId("61f25aa8b8edc7891f897f63"),
    "name" : "search team",
    "num" : 1,
    "join_field" : [ 
        {
            "_id" : ObjectId("61f25a65b8edc7891f89778c"),
            "name" : "lee chang ho",
            "age" : "33",
            "team" : 1
        }, 
        {
            "_id" : ObjectId("61f25a80b8edc7891f897ac8"),
            "name" : "kim chul su",
            "age" : "30",
            "team" : 1
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("61f25ab0b8edc7891f898033"),
    "name" : "data team",
    "num" : 2,
    "join_field" : [ 
        {
            "_id" : ObjectId("61f25a8db8edc7891f897c3e"),
            "name" : "sunja",
            "age" : "23",
            "team" : 2
        }
    ]
}

 

위와 같이 각 팀에 속한 사람들을 embeded 형태로 묶을 수 있게 되었다.

하지만 이 같은 방법은 건수가 적을때만 쓰시길 권장한다..

'MongoDB' 카테고리의 다른 글

Bson 이란?  (0) 2022.04.21
MongoDB 정리  (0) 2022.02.15
MongoDB 자주 쓰는 쿼리  (0) 2022.01.26