Loading...

DB/MongoDB / / 2022. 5. 20. 17:53

몽고DB 18강. aggregate $lookup 조인

반응형

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

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

 

더미 데이터를 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

 
반응형