복붙노트

[MONGODB] MongoDB의에서 $ 조회 여러 컬렉션에 참여하는 방법

MONGODB

MongoDB의에서 $ 조회 여러 컬렉션에 참여하는 방법

나는 총 $ 조회를 사용하여 MongoDB에서 두 개 이상의 컬렉션에 참가하고 싶다. 그것은 가입 할 수 있습니까? 나에게 몇 가지 예를 제공합니다.

여기에 세 가지 컬렉션을 가지고 :

사용자 :

{    
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
    "email" : "admin@gmail.com",
    "userId" : "AD",
    "userName" : "admin"
}

사용자 정보:

{
    "_id" : ObjectId("56d82612b63f1c31cf906003"),
    "userId" : "AD",
    "phone" : "0000000000"
}

userrole :

{
    "_id" : ObjectId("56d82612b63f1c31cf906003"),
    "userId" : "AD",
    "role" : "admin"
}

해결법

  1. ==============================

    1.는 MongoDB를 3.2 이상 버전에서 지원하는 기능을 가입 할 수 있습니다. 당신은 집계 쿼리를 사용하여 조인 사용할 수 있습니다. 당신은 예를 아래에 사용하여 수행 할 수 있습니다

    는 MongoDB를 3.2 이상 버전에서 지원하는 기능을 가입 할 수 있습니다. 당신은 집계 쿼리를 사용하여 조인 사용할 수 있습니다. 당신은 예를 아래에 사용하여 수행 할 수 있습니다

    db.users.aggregate([
    
        // Join with user_info table
        {
            $lookup:{
                from: "userinfo",       // other table name
                localField: "userId",   // name of users table field
                foreignField: "userId", // name of userinfo table field
                as: "user_info"         // alias for userinfo table
            }
        },
        {   $unwind:"$user_info" },     // $unwind used for getting data in object or for one record only
    
        // Join with user_role table
        {
            $lookup:{
                from: "userrole", 
                localField: "userId", 
                foreignField: "userId",
                as: "user_role"
            }
        },
        {   $unwind:"$user_role" },
    
        // define some conditions here 
        {
            $match:{
                $and:[{"userName" : "admin"}]
            }
        },
    
        // define which fields are you want to fetch
        {   
            $project:{
                _id : 1,
                email : 1,
                userName : 1,
                userPhone : "$user_info.phone",
                role : "$user_role.role",
            } 
        }
    ]);
    

    이 같은 결과를 줄 것이다 :

    {
        "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
        "email" : "admin@gmail.com",
        "userName" : "admin",
        "userPhone" : "0000000000",
        "role" : "admin"
    }
    

    이 당신이나 다른 사람을 도움이되기를 바랍니다.

    감사

  2. ==============================

    2.당신은 실제로 여러 $ 조회 단계를 체인 수 있습니다. profesor79 공유하는 컬렉션의 이름을 바탕으로, 당신은이 작업을 수행 할 수 있습니다 :

    당신은 실제로 여러 $ 조회 단계를 체인 수 있습니다. profesor79 공유하는 컬렉션의 이름을 바탕으로, 당신은이 작업을 수행 할 수 있습니다 :

    db.sivaUserInfo.aggregate([
        {
            $lookup: {
               from: "sivaUserRole",
               localField: "userId",
               foreignField: "userId",
               as: "userRole"
            }
        },
        {
            $unwind: "$userRole"
        },
        {
            $lookup: {
                from: "sivaUserInfo",
                localField: "userId",
                foreignField: "userId",
                as: "userInfo"
            }
        },
        {
            $unwind: "$userInfo"
        }
    ])
    

    이것은 다음과 같은 구조를 반환합니다 :

    {
        "_id" : ObjectId("56d82612b63f1c31cf906003"),
        "userId" : "AD",
        "phone" : "0000000000",
        "userRole" : {
            "_id" : ObjectId("56d82612b63f1c31cf906003"),
            "userId" : "AD",
            "role" : "admin"
        },
        "userInfo" : {
            "_id" : ObjectId("56d82612b63f1c31cf906003"),
            "userId" : "AD",
            "phone" : "0000000000"
        }
    }
    

    어쩌면 MongoDB를 관계형 될 운명되지 않았기 때문에이 안티 패턴으로 간주 될 수 있지만, 유용합니다.

  3. ==============================

    3.문서에 따르면, $ 조회는 하나의 외부 수집을 가입 할 수 있습니다.

    문서에 따르면, $ 조회는 하나의 외부 수집을 가입 할 수 있습니다.

    당신이 할 수있는 것은 제공 예를 관계형 DB 스키마를 기반으로, 하나 명의 컬렉션 사용자 정보 및 userRole을 결합하는 것입니다. 몽고가되는 NoSQL 데이터베이스입니다 -이 문서 관리를위한 다른 접근 방법이 필요합니다.

    디스플레이 결합 된 데이터 지난 쿼리에 사용 된 새 임시 모음을 만드는 - userRole와 사용자 정보를 결합하여 2 단계 쿼리, 검색 할 수 있습니다. 지난 쿼리에서 $를 사용하고 나중에 사용하기 위해 병합 된 데이터와 함께 새로운 컬렉션을 만들 수있는 옵션이 있습니다.

    db.sivaUser.insert(
    {    
        "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
            "email" : "admin@gmail.com",
            "userId" : "AD",
            "userName" : "admin"
    })
    
    //"userinfo"
    db.sivaUserInfo.insert(
    {
        "_id" : ObjectId("56d82612b63f1c31cf906003"),
        "userId" : "AD",
        "phone" : "0000000000"
    })
    
    //"userrole"
    db.sivaUserRole.insert(
    {
        "_id" : ObjectId("56d82612b63f1c31cf906003"),
        "userId" : "AD",
        "role" : "admin"
    })
    
    db.sivaUserInfo.aggregate([
        {$lookup:
            {
               from: "sivaUserRole",
               localField: "userId",
               foreignField: "userId",
               as: "userRole"
            }
        },
        {
            $unwind:"$userRole"
        },
        {
            $project:{
                "_id":1,
                "userId" : 1,
                "phone" : 1,
                "role" :"$userRole.role"
            }
        },
        {
            $out:"sivaUserTmp"
        }
    ])
    
    
    db.sivaUserTmp.aggregate([
        {$lookup:
            {
               from: "sivaUser",
               localField: "userId",
               foreignField: "userId",
               as: "user"
            }
        },
        {
            $unwind:"$user"
        },
        {
            $project:{
                "_id":1,
                "userId" : 1,
                "phone" : 1,
                "role" :1,
                "email" : "$user.email",
                "userName" : "$user.userName"
            }
        }
    ])
    
  4. from https://stackoverflow.com/questions/35813854/how-to-join-multiple-collections-with-lookup-in-mongodb by cc-by-sa and MIT license