MONGO DB
몽고DB 데이터 모델링
yuurimingg
2023. 12. 21. 17:20
<연습>
1. 일대일 관계에서 학생과 그들의 개인 정보를 모델링하세요.
학생 컬렉션 생성
db.student.insertMany([
{'_id' : ObjectId(), 'name' : 'maria', 'personal_info_id' : 101},
{'_id' : ObjectId(), 'name' : 'yun', 'personal_info_id' : 202},
{'_id' : ObjectId(), 'name' : 'jin', 'personal_info_id' : 303}]);
개인정보 컬렉션 생성
db.personal_info.insertMany([
{'_id' : 101, 'address' : '서울', 'phone_number' : '010-1111-1111'},
{'_id' : 202, 'address' : '경기', 'phone_number' : '010-2222-2222'},
{'_id' : 303, 'address' : '부산', 'phone_number' : '010-3333-3333'}]);
personal_info_id가 101인 학생의 개인정보 가져오기
db.student.aggregate([
{
$match: {'personal_info_id': 101}
},
{
$lookup: {
from: 'personal_info',
localField: 'personal_info_id',
foreignField: '_id',
as: 'db.personal_info'
}
},
{
$unwind: '$db.personal_info'
},
{
$project: {
'_id' : 0,
'name': 1,
'personal_info_id' : 1,
'personal_info' : {
'address': '$db.personal_info.address',
'phone_number': '$db.personal_info.phone_number'}
}
}
]);
2. 일대다 모델링
도서관 컬렉션 생성
db.library.insertMany([
{'_id' : 111, 'name' : '성포 도서관', 'location' : '안산'},
{'_id' : 222, 'name' : '부곡 도서관', 'location' : '안산'},
{'_id' : 333, 'name' : '감골 도서관', 'location' : '안산'}]);
책 컬렉션 생성
db.book.insertMany([
{'title' : '어린왕자', 'author' : '앙투안 드 생텍쥐페리', 'library_id' : 111},
{'title' : '백설공주', 'author' : '야코프 그림', 'library_id' : 111},
{'title' : '신데렐라', 'author' : '샤를 페로', 'library_id' : 222},
{'title' : '잭과 콩나', 'author' : '벤자민 타바트', 'library_id' : 111},
{'title' : '인어공주', 'author' : '한스 크리스티안 안데르센', 'library_id' : 333},
{'title' : '키다리아저씨', 'author' : '진 웹스터', 'library_id' : 333},
{'title' : '피터팬', 'author' : '제임스 매슈 배리', 'library_id' : 222}]);
도서관id가 111에 있는 책 정보 가져오기
db.library.aggregate([
{
$match: { '_id': 111 }
},
{
$lookup: {
from: 'book',
localField: '_id',
foreignField: 'library_id',
as: 'db.book'
}
},
{
$unwind : '$db.book'
},
{
$project: {
'_id': 1,
'name': 1,
'book': {
'title': '$db.book.title',
'author': '$db.book.author'
}
}
}
]);
* lookup*
- from : 조인할 대상 컬렉션 이름
- localField : 현재 컬렉션에서 조인에 사용할 필드(현재 필트 : aggregate 앞에 있는 컬렉션)
=> -id 필드를 사용하여 library 컬렉션의 문서와 book 컬렉션의 library_id 필드를 조인
- foreignField : 대상 컬렉션에서 조인에 사용할 필드 (from에 있는 컬렉션의 필드)
- as : 결과로 생성된 배열을 저장할 새로운 필드의 이름