DB/MongoDB

몽고DB 18강. aggregate $lookup 조인

JJJAEOoni 2022. 5. 20. 17:53
반응형

몽고디비는 조인을 하기위해 사용하는 데이터베이스가 아닌데

몽고디비에서 조인을 지원해준다.

 

더미 데이터를 insertMany로 저장해주자.

 

나중에 크롤링할때도 for문 돌면서 save하면 너무 오래걸리기 때문에

벌크 컬렉터 saveAll 해야한다.

 

1. 더미데이터

use("cosdb");

var users = [
{
        "_id" : ObjectId("60986fbe93843236060071d2"),
        "username" : "ssar",
        "password" : "1234",
        "phone" : "0102222"
},
{
        "_id" : ObjectId("6098700293843236060071d5"),
        "username" : "cos",
        "password" : "1234",
        "phone" : "0103333"
},
{
        "_id" : ObjectId("6098701b93843236060071d6"),
        "username" : "love",
        "password" : "1234",
        "phone" : "0103333"
}
]

db.users.insertMany(users);
var boards = [
{
        "_id" : ObjectId("609870ea93843236060071db"),
        "title" : "t1",
        "content" : "c1",
        "user_id" : ObjectId("6098700293843236060071d5")
},
{
        "_id" : ObjectId("6098711393843236060071dc"),
        "title" : "t2",
        "content" : "c2",
        "user_id" : ObjectId("6098700293843236060071d5")
},
{
        "_id" : ObjectId("6098712e5bd0ba17bce175a4"),
        "title" : "t3",
        "content" : "c3",
        "user" : {
                "username" : "love",
                "password" : "1234",
                "phone" : "0103333"
        }
},
{
        "_id" : ObjectId("6098726893843236060071de"),
        "title" : "t4",
        "content" : "c4",
        "user_id" : ObjectId("60986fbe93843236060071d2")
}
]

db.boards.insertMany(boards);

오브젝트아이디를 직접 넣어준 이유가 있다.

 

boards의 도큐먼트 안에 유저의 정보가 아닌 오브젝트 아이디가 들어있다.

오브젝트 아이디로 조인해서 가져올 수 있다.

// RDB와 동일
db.users.find({_id:ObjectId("6098700293843236060071d5")});

하지만 제약조건이 없다.

강제성이 부여되지 않는것이다.

 

user_id의 자리에 존재하지 않는 오브젝트 아이디를 걸어줘도 문제가 없다는것이다.

제약조건이 없으니까.

 

몽고DB에서는 user_id가 아닌 유저의 필요한 정보를 도큐먼트로 적어주는게 정상적이다.

그리고 필요한 데이터만 가져갈 수 있다는 것도 장점이다.

"user_id": {
  "$oid": "6098700293843236060071d5"
}

"user": {
  "username": "cos",
  "password": "1234",
  "phone": "0103333"
}

"user": {
  "username": "cos"
}

만약 아이디를 걸어둔다면 장점도있다.

데이터를 공유하기 때문에

유저의 데이터가 변경되어도 손댈곳이 없다는것이다.

 

 

2. $lookup 조인 사용

db.boards.aggregate([
  {$lookup: {
    "from":"users", // 누구랑 join 할거야
    localField:"user_id", // 로컬의 어떤 변수명에
    foreignField:"_id", // 외래키 이름
    as: "user" // 별칭
  }},
  {$project: {"user_id":0}}
]);

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형