MongoDB
문서 지향 오픈소스 NoSQL 데이터베이스로 키와 연결된 값의 집합으로 이루어진 Documents 이다
특징
- 비정형 데이터를 JSON 형식으로 저장
- 필드, 범위 기반, 문자열 패턴 일치 등 다양한 쿼리를 지원
- 확장성이 뛰어나며 데이터 파티셔닝 기능이 내장
- 샤딩을 통해 여러 서버에 워크로드를 분산하여 대용량 데이터를 효율적으로 관리
MongoDB의 주요 구성 요소와 기능
- Collection(컬렉션) : Document Group으로 RDB에서는 테이블에 해당하며, 동적 스키마를 가진다.
- Document(도큐먼트) : 관계형 데이터베이스에서는 행에 대응
- Mongo Shell(몽고 쉘) : MongoDB 인스턴스와 상호작용하는 JavaScript 쉘
- Sharding(샤딩) : 데이터를 여러 서버로 분산하는 프로세스
- 인덱싱, 집계, 파일 스토리지 등의 기능을 제공
- MongoDB는 대규모 데이터 처리, 빠른 확장이 필요한 경우, 또는 데이터 구조가 자주 변경되는 애플리케이션에 적합
기본 사용 방법
1. 데이터베이스 선택 use 'db_name'
use library;
2. 현재 DB에 할당된 데이터베이스를 확인 db
입력
db
3. 현재 데이터베이스의 컬렉션 반환 db.[collectionName]
db.books
4. DB 목록을 확인할 수 있다. show dbs
show dbs;
5. 현재 데이터베이스의 컬렉션을 확인할 수 있다. show collections
show collections;
6. 데이터베이스의 사용자 확인할 수 있다. show users
show users;
7. 현재 데이터베이스의 상태 확인 db.stats()
db.stats()
생성(create), 읽기(read), 갱신(update) 삭제(delete) 네 가지 기본적인 작업을 수행
1. 생성(create)
insertOne() : 1개의 document를 insert
book = {
"_id": ObjectId(),
"title" : "MongoDB",
"author": "DevPaik",
"publication_year": 2024
}
db.books.insertOne(book);
insertMany() : 여러 Document를 insert
- 모든 Document는 16MB 보다 작아야 한다.
- 도큐먼트 option에 'ordered' 키에 true 를 지정하면 도큐먼트가 제공된 순서대로 삽입된다. false를 지정하면 MongoDB가 성능을 개선하려고 삽입을 재배열할 수 있다.(기본 값 정렬된 삽입)
bookList = [
{ "title" : "MySQL",
"author": "DevPaik",
"publication_year": 2024
},
{ "title" : "MongoDB",
"author": "DevPaik",
"publication_year": 2024
}
]
db.books.insertMany(
bookList
,{"ordered": true}
);
2. 읽기(read)
findOne() - 단일 도큐먼트 조회
db.books.findOne();
db.books.findOne({title: "MongoDB" });
find() - 여러건 조회
db.books.find({title: "MongoDB" });
3. 갱신(update)
키를 추가, 변경, 삭제할 때는 항상 $
제한자를 사용한다.
updateOne() : 단건 업데이트
db.books.updateOne(
{ title: "MongoDB" },
{ $set: {author: "Chris"} }
);
updateMany() : 여러 건 업데이트
db.books.updateMany(
{ "title": "MongoDB" },
{ $set: { "reviews": "재미있어용" } }
);
$set
은 필드 값을 설정하고 필드가 존재하지 않을 경우 새 필드가 생성된다. (스키마를 갱신하거나 사용자 정의 키를 추가할 때 편리)
db.books.updateOne({title: "MongoDB"}, {$set: {date: new Date()}});
$unset
으로 키와 값을 제거할 수 있다.
db.books.updateOne({title: "MongoDB"}, {$unset: {date: null}});
$inc
연산자 : 이미 존재하는 키 값을 변경하거나 새 키를 생성하는데 사용
db.books.updateOne({title: "MongoDB"}, {$inc: {loan : 1}})
갱신 요청이 동시 발생 시 서버에 먼저 도착한 요청이 적용된 후 다믕 요청이 적용되므로, 여러개의 갱신 요청이 빨리 발생하더라도 결국 마지막 요청이 최종 값으로 변경된다. (기본 동작을 원하지 않을 경우 : Document 비저닝 패턴을 고려)
ReplaceOne() : 도큐먼트를 새로운 것으로 완전히 치환 (스키마 마이그레이션 시 유용)
var book = db.books.findOne({"title" : "MongoDB"});
var book = db.books.findOne({_id : ObjectId("66dfd5bf28a9a762d47dc0ce")});
book.reviews = "재미있다!";
db.books.replaceOne({_id : ObjectId("66dfd5bf28a9a762d47dc0ce")}, book);
$push
는 배열이 존재할 경우 배열 끝에 요소를 추가하고 존재하지 않을 경우 새로운 배열을 생성한다.
db.books.updateMany(
{ title: "MongoDB" },
{ $push : { "categories" : "IT"} }
);
db.books.updateMany(
{ title: "MongoDB" },
{ $push : { "categories" : "COMPUTER"} }
);
$push
에 $each
연산자를 이용하면 한번에 여러 값을 추가할 수 있다.
db.books.updateMany(
{ title: "MongoDB" },
{ $push : { "categories" :{ $each : ["DB", "NO_SQL"] } } }
);
$slice
와 $push
를 결합하여 배열이 특정 크기 이상으로 늘어나지 않게 할 수 있다.
db.books.updateMany(
{ title: "MongoDB" },
{ $push : {
"categories" :
{ $each : ["DB", "NO_SQL"],
$slice: -10 //10 제한
}
}
}
);
$pop
: 배열 요소 제거
db.books.updateMany(
{ title: "MongoDB" },
{ $pull : { "categories" :"NO_SQL" } }
);
4. 삭제(delete) - 도큐먼트를 DB에서 삭제
deleteOne() : 단건 삭제
db.books.deleteOne({title: "MongoDB"});
deleteMany() : 여러 건 삭제
db.books.deleteMany({title: "MongoDB" });
drop() : 전체 컬렉션 삭제
db.books.drop()
기본 데이터형
null : 존재하지 않는 필드를 표현하는데 사용
{ "author": null}
Boolean : true, false 에 사용
{isDelete: true)
숫자(Number) : 64비트 부동소수점 수를 기본으로 사용
{price: 1000}
{price :1000.5}
4바이트 혹은 8바이트 부호 정수 : NumberInt, NumberLong 클래스를 사용
{price: NumberInt("1000")}
{price :NumberLong("100000")}
문자열
{"title": "MongoDB"}
날짜
1970 1월 1일부터의 시간을 1/1000초 단위로 나타내는 64비트 정수로 날짜를 저장하며, 표준시간 대는 저장하지 않는다.
{"date": new Date()}
정규표현식
{"regex": /MongoDB/i}
배열 : Set or list 를 배열로 표현
{"data": [ {"title" : "MySQL", "author": "DevPaik", "publication_year": 2024},
{"title" : "MongoDB", "author": "DevPaik", "publication_year": 2024}
]
}
내장 도큐먼트 : 도큐먼트는 부모 도큐먼트의 값으로 내장된 도큐먼테 전체를 포함가능
{data: {"title" : "MySQL", "author": "DevPaik", "publication_year": 2024}}
객체 ID : 도큐먼트용 12바이트 ID
{"_id" : ObjectId()}
코드 : 쿼리와 도큐먼트는 임의의 자바 스크립트 코드를 포함 할 수 있다.
{"script": function() { return this.title + " by " + this.author; } }
MongoDB는 하나의 컬렉션에서 모든 Document는 _id Key
를 가지며 ObjectId()
를 기본으로 생성한다.