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 |