- 아래 참고 URL(https://velopert.com/)에서 보며 공부하면서 정리를 하였습니다. 더 정확한 정보를 얻기 위해서는 참고URL에서 확인해주시기 바랍니다.
1. 설치 페이지 접근(현재버전 4.0, 2018.08.22)
https://www.mongodb.com/download-center?jmp=homepage#atlas



- mongoDB compass : MongoDB GUI Client 도구
- 설치 간 this may take a few minutes에서 진행이 안될경우 Compass설치를 해제 하고 다시 설치를 하자(재부팅 필요)
- 경로를 d드라이브로 잡더라도 실제 설치파일은 c드라이브에 설치된다. 하지만 데이터 저장소는 d드라이브에 생성
2. 실행파일 별 분류
- mongo.exe : mongoDB를 조작할 수 있는 MongoDB shell 프로그램
3. 데이터 구조
- Database : Collection의 물리적 컨테이너
- Collection : RDBMS에서의 table이라고 생각하면 된다. Document의 그룹, Document의 내부에 위치해 있음, RDBMS와 달리 스키마를 따로 갖고 있지 않음(동적스키마로 생성)
- Document : nosql을 다른말로 Document Oriented Database라 함, 한개 이상의 key-value 쌍으로 이루어진 구조, 일반 rdbms에서는 row or tuple과 유사하다 생각하면 된다.
- Key/Field : 일반 Rdbms에서 Column이라 생각하면 된다. 컬럼 명과 저장 값으로 생각하면 쉽다.
4. 기본명령어+CRUD
- show dbs : 데이터베이스 리스트가 출력

- db : 현재 사용하고 있는 데이터베이스 출력
- db.stats() : 현재 사용 하고 있는 데이터 베이스 출력

- use database : 데이터베이스 스위치 혹은 생성(존재 하지 않을 경우 생성)

- db.dropDatabase() : 데이터베이스를 삭제
- db.createCollection(“book”,{capped:true, size:6142800, max:10000})
- capped : boolean타입, true로 설정 시 활성화, capped collection이란 고정된 크기(fixed size)를 가진 컬렉션, 사이즈가 초과시 가장 오래된 데이터를 덮어씀
- size : capped가 true일 경우 필수로 설정 해야되는 값이며, 해당 컬렉션의 최대사이즈(단위:byte)
- max : 해당 컬렉션에 추가 할 수 있는 최대 document 갯수

- db.book.insert({“name”:”abc”}) , single
- key/field 값을 입력 할 있다. 만약 collection이 생성 되지 않았을 경우 자동으로 생성된다.
- multi로 저장하기 위해서는
db.book.insert([{“name”:”abc”},{“name”:”def”}])
와 같이 대괄호를 묶어줘야된다.
- 여러 행 저장은 []을 이용한다.


- db.book.drop()
- test데이터베이스의 book이라는 collection을 제거
- 제거전에는 필수로 use database를 이용하여 현재 데이터베이스를 설정 해야된다.

- db.books.find()
- Document 리스트를 확인

- db.book.remove({“name”:”def”})
- Document 리스트 삭제

5. search
- mock data 생성
- db.book.insert({“name”:”A”,”hits”:100,”auther”:[{“name”:”park”},{“name”:”lee”}]});
- db.book.insert({“name”:”B”,”hits”:50,”auther”:[{“name”:”kim”}]});
- db.book.insert({“name”:”C”,”hits”:30,”auther”:[{“name”:”kim”},{“name”:”choi”}]});

- db.book.find().pretty()
- 다큐먼트를 좀더 깔끔하게 보여준다.

- db.book.find().pretty()
- 다큐먼트를 좀더 깔끔하게 보여준다. - db.book.find({“name”:”A”}).pretty()
- name이 A인 document을 조회한다.

- db.book.find({“hits”:{$gte:50}}).pretty();
- hits가 50 이상인 document를 조회한다.
-$gte는 greater than or equals(~보다 크거나 같거나), $lte는 less than or equals(~보다 작거나 같거나)

- db.book.find({“hits”:{$gt:40, $lt:70}}).pretty();
- hits가 40 초과 70 미만
- $gt(~보다 큰), $lt(~보다 작은)

- db.book.find({“name”:{$in:[“A”,”B”]}}).pretty();
- name이 A, B인 Document

- db.book.find({$or:[{“name”:”A”},{“hits”:50}]}).pretty()
- name이 A 혹은 hits가 50인 Document

- db.book.find({$and:[{“hits”:{$lte:50}}, {“name”:”B”}] }).pretty()
- hits가 50 이하 and name이 B인 Document

- db.book.find({“name”:{$regex:/a|b/,$options:”i”}}).pretty()
db.book.find({“name”:/a|b/i}).pretty()
- a또는 b 를 정규식으로 검색 option: i는 대소문자 무시

- db.book.find({$where: “this.name == ‘A’”}).pretty()
- $where을 이용하면 자바스크립트 표현식(expression)을 사용할 수 있다.

- db.book.find({$and:[{$where:”this.auther.length == 2”}, {“name”:”c”}]}).pretty()
- auther의 Field가 2개 이며 name이 c인 Document를 검색

- db.book.find({“auther”:{$elemMatch:{“name”:”park”}}}).pretty();
- embedded Document란 auther Field처림 Document 안 배열 형태로 있는 Document 를 말합니다. $elemMatch는 이러한 것들을 검색 할 때 이용합니다.

- db.book.insert({“name”:”D”,”hits”:200,”auther”:[],”language”:[“eng”,”kor”,”jpn”],”seller”:{“name”:”saramin”}})
- Embedded Document배열이 아닌경우 접근을 해보기 위해 mock 데이터 추가

- db.book.find({“language”:”eng”}).pretty()
- Embedded Document가 아니고 배열일 경우 바로 접근하면 된다.

- db.book.find(“seller.name”:”saramin”).pretty()
- Embedded Document가 아니고 Key/Field일 경우도 .형태로 접근 가능

- db.book.find({},{“_id”:false,”name”:true,”hits”:true});
- 2번째 인자값은 option으로 보여질 Field에 대한 결정을 함

- db.book.find({$and:[{“name”:”A”}]},{“auther”:{$slice:1}}).pretty()
-$slice를 하면 해당 갯수만큼의 Document만큼만 갖고온다.

- db.book.find({“auther”:{ $elemMatch : {“name”:”park”}}},{”name”:true,”auther.name”:true,”auther”:{$elemMatch : {“name” : “park”}})

6. sort
- db.book.find().sort({“hits”:1}).pretty()
- 1은 오름차순, -1은 내림차순

7. limit
- db.book.find().limit(2).pretty()
- 2개만 출력한다.

8.skip
- db.book.find().skip(2)
- 리스트에서 2개를 skip후 Document를 출력

9. 함수화
- var showpage = function(page){
return db.book.find().sort({“hits”:-1}).skip((page-1)*2).limit(2);
}
showpage(1)
showpage(2)

10. update
- db.book.update({“hits”:110},{$set:{“hits”:120}})
- update 첫번째인자는 검색 key/field,
두번째 인자는 업데이트 {$set: {key:field}}

11.replace
- db.book.update({“hits”:120},{hits:125,name:”AA”})
- hits를 120에서 125로 업데이트를 하며 기존에 name이 없었는데 AA를 추가

- db.book.update({name:”F”},{name:”F”,hits:20}),{upsert:true})
- upsert : 값이 없을 경우 insert 아니면 update

- db.book.update({hits:{$lte:30}},{$set:{bestseller:”N”}},{multi:true})
- 여러 행을 업데이트 할 경우 {multi:true}로 설정

- db.book.update({name:”F”},{$push:{category:”science”}})
- $push를 이용하여 category라는 field에 science라는 배열 추가

- db.book.update({name:”F”},{$pull:{category:”science”}})
- $pull을 이용하여 science 배열 값 제거

12. Index
- db.book.createIndex({name:1})
- single field index : 단일 key 인덱스, 1은 오름차순, -1은 내림차순

- db.book.createIndex({name:1, hits:-1})
- compound(복합) field index : 복합적으로 key index

- 그외 multikey index(배열일 경우 사용), geospatial index(지도), text index(text 검색), hash index(hash 인덱스 속도는 좋으나, 정렬이 안됨)
- db.book.createIndex({name:1},{unique:true})
- 유일속성을 지정할 수 있다.

- db.book.createIndex({name:1,hits:-1},{partialFilterExpression:{hits:{$gte:100}}})
- hits가 100 이상인 field에만 인덱스를 적용 할 수도 있다.

- db.book.getIndexes()
- index 조회

- db.book.dropIndex({name:1})
- name에 건 인덱스를 제거
