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 : 결과로 생성된 배열을 저장할 새로운 필드의 이름