맛있는 Mongo DB 책 공부하면서 정리한 내용
Docker로 실행 시키기
# 도커 컨테이너 실행
docker run --name mongodb -d -p 27017:27017 mongo --auth
# 컨테이너 접속
docker exec -it mongodb bash
Bash
복사
auth 옵션이 있으면 무조건 유저를 만들어야함
Mongo 관리 도구
// MongoDB 관리 툴 (24시간까지의 정보만 제공)
db.enableFreeMonitoring()
db.disableFreeMonitoring()
JavaScript
복사
기본 설명
구성요소
데이터베이스 → 컬렉션 → 도큐먼트
데이터 타입
•
기본 데이터 타입은 JSON과 동일
•
타임스탬프(Timestamp)
•
날짜(Date)
◦
시간 저장
•
오브젝트ID(ObjectID)
◦
서로 겹치지 않는 아이디 (Primary Key)
◦
_id 필드에 생성
작동
•
장기 저장 장치에 바로 데이터를 저장하지 않고 메모리에 미리 저장한후에 천천히 저장장치로 데이터를 옮긴다.
◦
갑자기 서버가 다운되면 메모리가 날라갈수있음
◦
WriteConcern 값을 통해 데이터 손실을 어떻게 막을지 결정
쉘 명령어
1. 기본 명령어
정해진 크기를 초과하게 되면, 자동으로 가장 오래된 데이터를 삭제
db.createCollection(<컬렉션 이름>, {capped: true, size: <제한할 크기>})
JavaScript
복사
// 현재 세팅된 데이터베이스
db
// 데이터베이스 목록
show dbs
// 세팅된 데이터베이스 안에 있는 컬렉션 목록
show collections
// 상태 조회
db.stats()
db.collection.stats()
db.collections.isCapped()
// 삭제, 수정
db.dropDatabase()
db.collection.drop()
db.collection.rename.Collection([바꿀 이름])
JavaScript
복사
2. 도큐먼트 생성
// 단일 도큐먼트 생성
db.collection.insertOne(
<document>,
{
writeConcern : <document>
}
)
db.collection.insertOne({key : "value"})
JavaScript
복사
// 다수 도큐먼트 생성
db.collection.insertMany([
[document1],
[document2],
[document3]
],
{
writeConcern : [document],
ordered: true // 순차적으로 들어갈지
}
)
db.collection.insertMany([
{test1 : 1, test1_two : 2},
{test2 : 3, test2_two : 4}
])
JavaScript
복사
•
db에 최초에 한번 값을 넣을떄 db가 생성됨
•
따로 collection을 만들지 않아도 삽입하면 자동으로 생성된다.
•
_id 값을 정해줄수있다. 단, 겹치면 에러난다.
3. 도큐먼트 조회
// 도큐먼트 확인
db.collection.find([쿼리], [프로젝션])
db.collection.find().pretty()
JavaScript
복사
// 쿼리는 어떤 도큐먼트를 불러올지 정한다.
db.collection.find({category: "animal", name: "bear"})
db.collection.find({name.firstName: "Karoid"})
db.collection.find({numbers.0: 52})
JavaScript
복사
// 프로젝션은 도큐먼트의 어떤 필드를 보여줄지를 정한다.
// name 필드만 보여준다.
db.collection.find(null, {name: true})
db.collection.find(null, {name: 1})
// name 필드를 제외하고 다 보여준다.
db.collection.find(null, {name: false})
db.collection.find(null, {name: 0})
// _id 필드는 제외
db.collection.find(null, {name: true, _id: false})
JavaScript
복사
•
_id필드를 제외한 필드를 설정할때는 참 또는 거짓 만 존재하도록 설정해야한다.
커서
•
find 는 명령어를 실행하면 batch라는곳에 100개씩 도큐먼트를 모아두고 20개씩 커서가 가리키고있다.
◦
커서는 10분을 넘기면 비활성화된다
•
forEach 메소드는 커서로 도큐먼트를 순차적으로 불러온다.
// 모든 결과를 배열에 담는다. 매우 비효율적 + 메모리 초과
db.collection.find().toArray()
// 커서로 결과를 하나씩 불러오기 때문에 효율적
db.collection.find().forEach(function(document)) {
// do something
}
JavaScript
복사
4. 도큐먼트 수정
// 단일 도큐먼트 교체
db.collection.replaceOne(
[쿼리],
[도큐먼트],
{
upsert: true, // 쿼리한 도큐먼트가 없으면 새로 추가
writeConcern: [도큐먼트],
collation: [도큐먼트]
}
)
JavaScript
복사
•
수정이 아니라 교체이기 떄문에 기존의 내용이 전부 사라진다.
•
_id 필드가 바뀌지 않음
// 도큐먼트 수정
db.collection.updateOne(
[쿼리],
[업데이트],
{
upsert: true,
writeConcern: [도큐먼트],
collation: [도큐먼트],
arrayFilters: [도큐먼트]
}
)
db.collection.updateMany()
JavaScript
복사