티스토리 뷰

NodeJS

MongoDB Join 간단 예제

Grand_J 2019. 8. 2. 09:17
반응형

MongoDB Join 간단 예제

 

db.getCollection('collection1').aggregate([
    {
        $lookup: {
            from: 'collection2',
            localField: 'user_id',      // tgm_fvrt_mgmt join key
            foreignField: 'user_id',    // tgb_user_mgmt join key
            as: 'collection2_object'
        }
    },

    {   $unwind:'$collection2_object' },       // $unwind used for getting data in object or for one record only 
])

참고 - https://stackoverflow.com/questions/35813854/how-to-join-multiple-collections-with-lookup-in-mongodb

 

한 row에 표현하기

db.getCollection('collection1').aggregate([ 
    { 
        $lookup: { 
            from: 'collection2', 
            localField: 'user_id',      // collection1 join key 
            foreignField: 'user_id',    // collection2 join key 
            as: 'collection2_object' 
        } 
    },

    {
      $replaceRoot: { newRoot: { $mergeObjects: [ '$$ROOT' , { $arrayElemAt: [ '$collection2_object', 0 ] } ] } }           // Root Object + collection2_object array[0] merge
    },
    { $project: { fromItems: 0, 'collection2_object' : 0 } },    // remove collection2_object object
])

참고 - https://docs.mongodb.com/master/reference/operator/aggregation/lookup/#pipe._S_lookup

 

두개 컬렉션 조인

db.getCollection('collection1').aggregate([    
    { 
        $lookup: { 
            from: 'collection2', 
            localField: 'user_id',       // collection1 join key 
            foreignField: 'user_id',    // collection2 join key 
            as: 'user_object' 
        } 
    },        
    { 
        $lookup: { 
            from: 'collection3', 
            localField: 'user_object.dept_cd',      // user_object join key 
            foreignField: 'dept_cd',                  // collection3 join key 
            as: 'dept_object' 
        } 
    },    
    {   $unwind:'$user_object'  },        // array[0] > object
    {   $unwind:'$dept_object' },        // array[0] > object
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ '$$ROOT', '$user_object', '$dept_object' ] } }      // Root Object + user_object Object dept_object Object 
    },
    { $project: { fromItems: 0, 'user_object' : 0, 'dept_object' : 0 } },   // remove user_object object dept_object 
]) 

 

검색 및 페이징 처리 


db.getCollection('collection1').aggregate([
    { 
        $match: { 
            $and: [
                { 'user_id': { $eq: 'user1' } },     // search data
            ] 
        } 
    },
    { $sort: {_id: -1} },       // Latest first
    { $skip: 0 },               // skip
    { $limit: 10 },             // page size
    { 
        $lookup: { 
            from: 'collection2', 
            localField: 'user_id',      // collection1 join key 
            foreignField: 'user_id',    // collection2 join key 
            as: 'user_object' 
        } 
    },
    { 
        $lookup: { 
            from: 'collection3', 
            localField: 'user_object.dept_cd',      // user_object join key 
            foreignField: 'dept_cd',                // collection3 join key 
            as: 'dept_object' 
        } 
    },    
    { $unwind:'$user_object' },       // Array[0] > Object
    { $unwind:'$dept_object' },       // Array[0] > Object
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ '$$ROOT', '$user_object', '$dept_object' ] } }      // Root Object + user_object Object + dept_object Object
    },
    { $project: { fromItems: 0, 'user_object' : 0, 'dept_object' : 0 } },   // remove user_object, dept_object object   
]) 

 

 

순차적으로 실행되는 듯

 

 

 

끘@#$!#$!@

반응형