몽고디비는 조인을 하기위해 사용하는 데이터베이스가 아닌데
몽고디비에서 조인을 지원해준다.
더미 데이터를 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