Database

[DB] MongoDB

kyoulho 2024. 8. 2. 12:17

MongoDB는 NoSQL 데이터베이스로, 비관계형 데이터베이스 시스템이다. 전통적인 관계형 데이터베이스와 달리, MongoDB는 JSON과 유사한 BSON(Binary JSON) 형식의 문서를 사용하여 데이터를 저장하고 관리한다. 이러한 특성 덕분에 다양한 형식의 데이터를 유연하게 저장하고 빠르게 처리할 수 있다.

  • NoSQL: 비관계형 데이터베이스로, 스키마가 필요하지 않다.
  • JavaScript 질의어: 자바스크립트를 질의어로 사용하여 데이터베이스와 상호작용할 수 있다.
  • 배열 데이터: 배열 형태의 데이터를 효율적으로 저장하고 관리할 수 있다.
  • JSON 저장: JSON 형태의 데이터를 자유롭게 저장할 수 있다.

 

MongoDB 관리 도구


MongoDB Shell (mongosh)

  • 명령줄 인터페이스(CLI
  • MongoDB와 직접 상호작용하기 위한 JavaScript 인터페이스를 제공
  • 쿼리 실행, 데이터 조작, 관리 작업

Mongo Express

  • 웹 기반 MongoDB 관리 인터페이스
  • 그래픽 사용자 인터페이스(GUI)를 통해 MongoDB를 관리

 

개념


컬렉션 (Collection)

MongoDB에서 데이터를 저장하는 단위로, SQL 데이터베이스의 테이블과 유사하다. 하나의 데이터베이스 안에 여러 컬렉션을 가질 수 있으며, 각 컬렉션에는 여러 문서가 저장된다.

문서 (Document)

MongoDB에서 데이터를 표현하는 기본 단위로, JSON과 유사한 구조를 가진다. 각 문서는 고유한 필드와 값을 가지며, 하나의 컬렉션 안에 다양한 구조의 문서가 저장될 수 있다.

_id 필드와 ObjectId 타입

문서는 _id라는 특별한 이름의 필드를 가지며, 이 필드는 문서가 DB에 저장될 때 자동으로 생성된다. _id 필드는 UUID와 유사하지만, MongoDB에서는 ObjectId 형태로 사용된다.

> db.user.find({})
// [ { _id: ObjectId('66ac423bd51b9cec3735be64'), name: 'Jack' } ]

 

MongoDB Shell 기본 명령어


데이터 정의 언어 (DDL)

명령어 설명
show dbs DB 목록 조회하기
use DB_이름 DB 선택 및 생성하기 (실제 데이터가 생성될 때 생성됨)
db.dropDatabase() DB 삭제하기
db.createCollection(컬렉션_이름) 새로운 컬렉션 생성하기
show collections 현재 DB의 컬렉션 목록 조회하기
db.getCollectionNames() 현재 DB의 컬렉션 목록 조회하기 (배열에 담겨서 보여진다.)
db.컬렉션_이름.drop() 컬렉션 삭제하기

데이터 조작 언어 (DML)

명령어 설명
db.DB_이름.insertOne(문서) 단일 문서 생성하기
db.DB_이름.insertMany([문서1, 문서2, ...]) 여러 문서 생성하기
db.컬렉션_이름.find() 컬렉션의 모든 문서 조회하기
db.컬렉션_이름.findOne(조건) 컬렉션의 첫 번째 문서 조회하기
db.컬렉션_이름.updateOne
(조건, 필드_업데이트_연산자_객체, 옵션)
단일 문서 업데이트하기
db.컬렉션_이름.updateMany
(조건, 필드_업데이트_연산자_객체, 옵션)
여러 문서 업데이트하기
db.컬렉션_이름.findOneAndUpdate
(조건, 필드_업데이트_연산자_객체, 옵션)
조건에 맞는 단일 문서를 찾아서 업데이트하고,
업데이트된 문서를 반환하기
db.컬렉션_이름.deleteOne(조건) 단일 문서 삭제하기
db.컬렉션_이름.deleteMany(조건) 여러 문서 삭제하기

비교연산자

연산자 설명 예제
$eq 값이 같은지 비교 { 필드명: { $eq: 값 } }
$ne 값이 같지 않은지 비교 { 필드명: { $ne: 값 } }
$gt 값이 큰지 비교 { 필드명: { $gt: 값 } }
$gte 값이 크거나 같은지 비교 { 필드명: { $gte: 값 } }
$lt 값이 작은지 비교 { 필드명: { $lt: 값 } }
$lte 값이 작거나 같은지 비교 { 필드명: { $lte: 값 } }
$in 값이 배열에 속하는지 비교 { 필드명: { $in: [값1, 값2, ...] } }
$nin 값이 배열에 속하지 않는지 비교 { 필드명: { $nin: [값1, 값2, ...] } }

논리연산자

연산자 설명 예제
$and 모든 조건이 참인 문서를 검색 { $and: [ { 조건1 }, { 조건2 }, ... ] }
$or 하나 이상의 조건이 참인 문서를 검색 { $or: [ { 조건1 }, { 조건2 }, ... ] }
$nor 모든 조건이 거짓인 문서를 검색 { $nor: [ { 조건1 }, { 조건2 }, ... ] }
$not 조건이 거짓인 문서를 검색 { 필드명: { $not: 조건 } }

정규식 연산자

옵션 파라미터

  • i: 대소문자를 구분하지 않음 (case-insensitive)
  • m: 여러 줄 모드 (multiline)
  • x: 공백과 주석을 무시함 (extended)
  • s: 줄 바꿈 문자를 포함하여 검색 (dotall)
db.컬렉션_이름.find({ 필드명: { $regex: /패턴/, $options: '옵션' } });

// "test"라는 단어가 포함된 문서 검색 (대소문자 구분)
db.컬렉션_이름.find({ 필드명: { $regex: /test/ } });

// "test"라는 단어가 포함된 문서 검색 (대소문자 구분 안 함)
db.컬렉션_이름.find({ 필드명: { $regex: /test/i } });

// "start"로 시작하는 문서 검색
db.컬렉션_이름.find({ 필드명: { $regex: /^start/ } });

// "end"로 끝나는 문서 검색
db.컬렉션_이름.find({ 필드명: { $regex: /end$/ } });

// 여러 줄 모드로 검색 (여러 줄 텍스트에서 "line" 포함 문서)
db.컬렉션_이름.find({ 필드명: { $regex: /line/, $options: 'm' } });

필드 업데이트 연산자

필드 업데이트 연산자는 데이터를 동적으로 관리하는 데 사용된다.

연산자 설명 예제
$set 필드를 설정하거나 문서에 새로운 필드를 추가 { $set: { 필드명: 값 } }
$unset 필드를 삭제 { $unset: { 필드명: "" } }
$inc 숫자 필드의 값을 증가 { $inc: { 필드명: 증가값 } }
$dec 숫자 필드의 값을 감소 { $inc: { 필드명: -감소값 } }
$push 배열 필드에 값을 추가 { $push: { 필드명: 값 } }
$addToSet 배열 필드에 중복되지 않는 값을 추가 { $addToSet: { 필드명: 값 } }
$pop 배열 필드에서 첫 번째 또는 마지막 값을 제거 { $pop: { 필드명: 1 } } (마지막 값 제거)
$pull 배열 필드에서 조건에 맞는 값을 제거 { $pull: { 필드명: 조건 } }
$pullAll 배열 필드에서 여러 값을 제거합 { $pullAll: { 필드명: [값1, 값2, ...] } }
$rename 필드의 이름을 변경 { $rename: { 기존필드명: 새필드명 } }
$currentDate 필드를 현재 날짜와 시간으로 설정 { $currentDate: { 필드명: { $type: "date" } } }
728x90

'Database' 카테고리의 다른 글

[DB] Stored Procedure  (0) 2024.08.16
[DB] Stored Function  (0) 2024.08.15
[DB] 데이터베이스 기본 개념  (0) 2024.08.15
[DB] 인덱스  (0) 2024.08.06
파티셔닝과 샤딩  (0) 2024.07.22