관리 메뉴

CASSIE'S BLOG

MongoDB 정리 건 본문

PROGRAMMING/DB (Oracle, MongoDB, etc.)

MongoDB 정리 건

ITSCASSIE1107 2023. 11. 14. 12:56

MongoDB의 포함관계는 database > collections > documents 이다.

 

1. database

1-1. 생성

use 데이터베이스명 으로 생성한다. 이미 있는 경우엔 현존하는 데이터베이스를 사용한다. 1개 이상의 Collection이 있어야 데이터베이스 리스트에서 보인다.

1-2. 조회

  • db : 현재 사용중인 데이터베이스 확인
  • show dbs : 데이터베이스 리스트 확인
  • db.stats() : 데이터베이스 상태확인

1-3. 제거

db.dropDatabase() 로 데이터베이스를 제거한다. use로 해당 데이터베이스에 스위치하고선 실행해야한다.

 

 

메소드 정리 건 

조회 메소드

db.collection명.find()     - document 전체 조회. .pretty()붙이면 결과가 깔끔해진다.

db.colelction명.find({"likes":{$lte:30}})   -  likes 항목이 30이하인 document조회

db.collection명.find({"likes":{$gt:10,$lt:30}})   -  likes가 10보다 크고 30보다 작은 것 조회

db.collection명.find({"writer":{$in:["Alpha","Bravo"]}})   -  writer 항목이 ["Alpha","Bravo"] 배열안의 값들과 맞는 것들 조회

db.collection명.find({$and :[{"writer":"writer1"},{"likes":{$lt:10}}]})   -  AND 조건 조회.
= db.collection명.find("writer":"writer1","likes":{$lt:10})

db.collection명.find({"title":/article0[1-2]/})   -  정규식으로 조건 표현 가능. title이 article01, article02인 것들 조회

db.collection명.find({$where:"this.comments.length == 0"})   -  where절을 써서 표현 가능. comments배열이 비어있는 document 조회

db.collection명.find({"comments":{$elemMatch:{"name":"writer1"}}})   -  $elemMatch. embedded documents배열 쿼리 시 사용.
ex)comments:[{"title":"aaa","name":"writer1"},{"title":"bbb","name":"writer2"}] 형태에서 comments name이 writer1인 것 조회

db.collection명.find({"name.first":"abc"})   -  데이터 형태가 ex)name:[]

db.collection명.find({},{_id:false, title:true, content:true})   -  두번째 파라미터 이용. _id는 조회 안되고 title과 content만 조회된다.

db.collection명.find({"title":"title1"},{comments:{$slice:1}})   -  $slice는 embeded 배열 읽을 때 limit 설정. title값이 title1이인 document를 조회하지만 comments배열의 값은 하나만 조회.

db.collection명.find({"comments":{$elemMatch:{"name":"name1"}}}
,{"title":true,"comments:"{$elemMatch:{"name":"name1"}},"comments.name":true,"comments.message":true})
   -  comments중 name1이 작성한 덧글이 있는 document 중 제목 , 그리고 name1의 댓글만 조회


db.collection명.find().sort({"_id":1})   -  id기준 오름차순 정렬 조회

db.collection명.find().sort({"amount":1,"_id":-1})   -  amount 오름차순 하고 _id 내림차순 정렬

db.collection명.find().limit(3)   -  3개 까지만 조회

db.collection명.find().skip(2)   -  2개 데이터 생략하고 그 다음부터 조회

var showPage = function(page){
    return db.collection명.find().sort({"_id":-1}).skip((page-1)*2).limit(2)
}
   -  최신순으로 한 페이지당 2개씩 나타내기

 

 

Schema (스키마) 객체

mongoose에서는 데이터를 모델링할 때 Schema 객체 사용

 

사용자가 작성한 스키마를 기준으로 데이터를 DB에 넣기 전에 먼저 검사합니다. 스키마에 어긋나는 데이터가 있으면 에러를 발생시킵니다.

 

 

스키마 디자인을 할 때 고려할 수 있는 디자인 방식은 Embedding or Referencing 방식입니다.


Embedding
장점

하나의 쿼리문으로 필요한 모든 데이터를 가져올 수 있습니다.
$lookup 과 같은 Join 동작을 수행하지 않고 데이터를 가져올 수 있습니다.
한계점

Document가 커지면 오버헤드 또한 함께 커진다 (문서의 크기를 제한하여 쿼리 성능도 챙길 수 있습니다.)

Document는 16mb 의 크기 제한을 갖고 있어서 Embedding방식을 계속 사용한다면 언젠간 한계에 도달할 수도 있습니다.

Referencing

참조형 같은 경우 각각의 Document들이 가지고 있는 특별한 id 인 object id 와 $lookup 을 이용해 데이터를 참조할 수 있습니다.

이는 관계형 데이터베이스에서의 JOIN 과 흡사하게 동작하며, 이러한 구조는 데이터를 효율적이고 관리하기 쉽게 나누면서도 데이터 간의 관계를 유지할 수 있습니다.

장점

Document를 쪼개어 더욱 작은 단위의 Document를 가질 수 있으며, 이를 통해 16mb 크기 제한을 피할 수 있습니다.
필요하지 않은 정보에 대한 접근을 줄일 수 있습니다.
Document 를 참조하여 데이터를 가져오기에 Embedding 방식보다 데이터의 중복을 줄일 수 있습니다.
한계점

하나의 Document 안에 다수의 데이터가 참조형이라면 다수의 쿼리, $lookup, populate 가 필요합니다. (현재 프로젝트하며 걱정인 부분)

 

정리 잘 해주신 출처:https://sjh836.tistory.com/100

 

MongoDB 명령어 (database, collection, document, query, cursor, index)

참조문서https://docs.mongodb.com/v3.4/https://velopert.com/mongodb-tutorial-list버전별로 명령어가 조금 바뀌는 것 같다. 나는 3.4버전이다. 자세한건 공식 API문서를 참고하자. MongoDB의 포함관계는 database > collecti

sjh836.tistory.com

 

 

본격적인 코드를 설명하기 전에 사용할 용어를 통일하자면 다음과 같다.

- 스키마 : 데이터의 틀 (클래스)

- 모델 : 스키마를 통해 생성된 객체 (객체)

- 다큐먼트 : 몽고디비 상에서 존재하는 각 데이터

 

잘 정리해주신 출처: 
https://merrily-code.tistory.com/13

 

Express.js & MongoDB 기반 REST api 구현하기 - 3편

[지난 글 목록] Express.js & MongoDB 기반 REST api 구현하기 - 1편 (서버 만들기) Express.js & MongoDB 기반 REST api 구현하기 - 2편 (몽고디비 연결하기) 이전 단계에서 몽고디비(MongoDB)를 사용할 준비를 마쳤으

merrily-code.tistory.com

 

 

$match:

$match는 특정 기준에 따라 문서를 필터링하는 데 사용됩니다.
예시: { $match: { 필드: 값 } } - 해당 필드가 주어진 값과 일치하는 문서를 선택합니다.
$group:

$group은 지정된 표현식에 따라 문서를 그룹화하고, 그룹화된 데이터에 집계 연산을 수행합니다.
예시: { $group: { _id: "$필드", total: { $sum: 1 } } } - 해당 필드의 값으로 문서를 그룹화하고, 각 그룹의 총 개수를 계산합니다.
$project:

$project는 문서를 재구성하여 필드를 포함하거나 제외하고, 계산된 필드를 생성하거나 필드의 이름을 변경하는 데 사용됩니다.
예시: { $project: { 새필드: "$기존필드", _id: 0 } } - 기존 필드의 값을 가진 새로운 필드를 생성하고, 출력에서 _id 필드를 제외합니다.
$sort:

$sort는 파이프라인에서 문서를 정렬하는 데 사용됩니다.
예시: { $sort: { 필드: 1 } } - 특정 필드를 기준으로 문서를 오름차순으로 정렬합니다 (1은 오름차순, -1은 내림차순).
$limit:

$limit은 파이프라인에서 다음 단계로 전달되는 문서 수를 제한하는 데 사용됩니다.
예시: { $limit: 10 } - 파이프라인에서 첫 10개의 문서만을 다음 단계로 전달합니다.
이러한 연산자들은 Aggregation 파이프라인에서 함께 사용되면서 MongoDB 데이터에 대한 복잡한 변환과 분석 작업을 수행할 수 있게 해줍니다. 이 연산자들을 다양한 방식으로 조합하여 필터링, 그룹화, 프로젝션, 정렬, 그리고 제한 등 다양한 결과를 얻을 수 있습니다.

 

$group 예시:
가령, 사용자 컬렉션에서 사용자들을 나이(age)에 따라 그룹화하고, 각 그룹의 총 사용자 수를 계산한다고 가정해 봅시다.

 

db.users.aggregate([
  {
    $group: {
      _id: "$age",    // 나이를 기준으로 그룹화
      total: { $sum: 1 }  // 각 그룹의 총 사용자 수 계산
    }
  }
])



위 예시에서 $group은 나이($age)를 기준으로 사용자를 그룹화하고, 각 그룹에서 $sum 연산자를 사용하여 총 사용자 수를 계산합니다. _id는 각 그룹의 기준이 되는 필드를 의미합니다.

 

 

db.users.aggregate([
  {
    $project: {
      name: 1,
      email: 1,
      fullname: { $concat: ["$name", "-", "$email"] },  // 이름과 이메일을 합친 새로운 필드 생성
      _id: 0  // 출력에서 _id 필드 제외
    }
  }
])

 


${props}를 사용하는 것은 스타일드 컴포넌트(Styled-components)에서 유용한 패턴 중 하나입니다. 이 코드는 mobile 함수를 호출할 때 전달된 스타일(props)을 미디어 쿼리 내에서 해당 스타일로 삽입할 수 있도록 돕습니다.

위 예시에서 $project는 원하는 필드들을 선택하고, $concat 연산자를 사용하여 이름과 이메일을 합친 fullname이라는 새로운 필드를 생성합니다. 그리고 _id: 0을 사용하여 출력에서 _id 필드를 제외합니다.

반응형