Search
Duplicate
📍

Mongo DB 삽질

생성일
2022/05/15 23:19
태그
개발
맛있는 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
복사