MongoDB 설치 및 사용방법(기본부터 Index까지)

박상수
13 min readAug 23, 2018

--

  • 아래 참고 URL(https://velopert.com/)에서 보며 공부하면서 정리를 하였습니다. 더 정확한 정보를 얻기 위해서는 참고URL에서 확인해주시기 바랍니다.

1. 설치 페이지 접근(현재버전 4.0, 2018.08.22)
https://www.mongodb.com/download-center?jmp=homepage#atlas

1–1. 설치타입 설정(Complete)
1–2.설치경로 설정
1–3. mongoDB Compass설치
  • 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”}])
    와 같이 대괄호를 묶어줘야된다.
    - 여러 행 저장은 []을 이용한다.
insert(single)
insert(multi)
  • db.book.drop()
    - test데이터베이스의 book이라는 collection을 제거
    - 제거전에는 필수로 use database를 이용하여 현재 데이터베이스를 설정 해야된다.
  • db.books.find()
    - Document 리스트를 확인
  • db.book.remove({“name”:”def”})
    - Document 리스트 삭제
Document 3개가 삭제

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를 출력
2개 skip후 출력, 원래는 5개 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에 건 인덱스를 제거

참고

--

--