업데이트:

1. MongoDB 소개

MongoDB는 C++로 작성된 문서지향적 NoSQL 데이터베이스이다.
NoSQL 데이터베이스 중 사용 인지도 1위이다.
10gen 이란 회사에서 2007년에 처음 개발했으며 2009년 오픈소스로 전향한 DB이다.
구글, 페이스북, 포스퀘어, 뉴욕타임즈, 이베이 등 주요 대기업 또는 SNS업체에서 많이 사용한다.
Javascript의 JSON(BSON) 형태의 데이터 구조를 가진다.

2. NoSQL이란

SQL(Structured Query Language) : 구조적 질의 언어
NoSQL(No Structured Query Language) : 구조가 없는 질의 언어
즉 Table(Collection)에서 스키마(Schema)를 가지고 있지 않음.

3. Collection와 Document는 뭔가요?

RDBMS = 테이블(Table), 데이터(Row)
MongoDB = 테이블(Collection), 데이터(Document)
기존에 테이블 구조와 전혀 다르기 때문에 명칭을 서로 달리하였다.

4. RDBMS Table의 구조

RDBMS의 테이블은 스키마(Schema)를 가지고 있고 고정된 구조이다.
예) 스키마
wr_id int(11)
wr_subject varchar(255)
wr_content text

5.MongDB 특징

  • 여러개의 테이블 구조를 배열 형태로 하나의 컬렉션으로 관리할 수 있다(데이터를 읽을 때 JOIN하는 구조가 아니라 데이터를 생성할 때 JOIN을 하게 된다)
  • 고정된 스키마로부터 구애 받지 않고 자유로운 문서 지향 데이터베이스이다
  • 다양한 타입 지원 (String, Integer, Boolean, Arrays, Timestamp, Date, Object) 등을 지원한다.
  • 읽기 쓰기 효육을 높이고 자동으로 장애 조치를 하고 확장이 용이함(특별한 경우를 제외하고 오류가 잘 안남)
  • 여러 서버에 분산 저장 및 확장이 용이하며(Sharding - 파편화), 방대한 데이터 처리가(빅데이터) 빠르다는 장점이 있다.

6. Robomongo 관리툴

  • 장점 :
    • 난해한 구조인 JSON 형태의 데이터를 일목요연하게 보여준다.
    • 컬렉션, 도큐먼트의 관리가 쉽다.

7. 테이블 생성

db.test.insert({
	"name":"park",
	"age":"30",
	"phone:":"010-123-1234",
	"addr":"서울특별시 중구"
})

8. 테이블 조회(대소문자 구별)

db.getCollection(‘콜렉션명[테이블명]’).find({}) : 콜렉션내에 있는 데이터를 전체조회
db.[콜렉션명].find({}) 도 가능
예)

   db.getCollection('board').find({})  
   db.board.find({})
  • 특정 데이터를 조회방법
    db.board.find({ "name" : "Kim" })
    
  • 한 건만 조회
    db.board.findOne({ "date" : "2016-11-10" })
    
  • and 조건
    db.board.find({ "date" : "2016-11-10", "name" : "Jang" })
    db.board.find({
     $and : [
        { "date" : "2016-11-10"}, 
        { "name" : "Jang" }
     ]
    })
    
  • or 조건
    db.board.find({
     $or : [
        { "date" : "2016-11-10"}, 
        { "name" : "Jang" }
     ]
    })
    
  • and & or 조건
    db.board.find({
     "date" : "2016-11-11",
     { $or:[
          {"name" : "Kim" },
          {"name" : "Kang" }
     ]}
    })
    
  • like 조회(정규표현식 사용가능) // a문자가 들어가는 모든 필드조회
    db.board.find({
      "name" : \a\
    })
    db.board.find({
      "name" : { $regex : 'a' }
    })
    // P로 시작하는 모든 필드조회
    db.board.find({
      "name" : \^P\
    })
    // g로 끝나는 모든 필드조회
    db.board.find({
      "name" : \g$\
    })
    
  • 부등호 조회
    db.board.find({
      "hits" : { $gt:10 } // 10보다 큰것
    })
    db.board.find({
      "hits" : { $lt:10 } // 10보다 작은 것
    })
    db.board.find({
      "hits" : { $gte:10 } // 10보다 크거나 같은 것
    })
    db.board.find({
      "hits" : { $lte:10 } // 10보다 작거나 같은 것
    })
    db.board.find({
      "hits" : { $ne:10 } // 10이 아닌 것
    })
    db.board.find({
      $and:[ {"hits" : { $gt:10 }}, {"hits" : {$lte : 25}} ] // hits > 10 and hits < 20
    })
    db.board.find({ "name":{$exists : true} }) //name필드가 null이거나 not null 인것을 조회
    
  • 정렬 조회
    db.board.find({}).sort({ "hits" : 1 }) //1은 오름차순
    db.board.find({}).sort({ "hits" : -1 }) //-1은 내림차순
    db.board.find({}).sort({ "date" : -1, "hits" : -1 }) //중복정렬
    db.board.find({}).limit(3) //3건만 가져옴
    db.board.find({}).skip(1) //index는 0 부터 시작하는데 0번째를 건너띄고 조회
    db.board.find({}).distinct("date") //date필드만 배열로 조회
    

9. 테이블 Insert

  db.users.insert({ //1건 입력
    "name" : "sue"
  })
  db.users.insert([ //다건 입력
    {
      "name" : "sue",
      "age" : 42,
      "status : "A"
    },
    {
      "name" : "park",
      "age" : 32,
      "status : "S"
    },
  ])
  db.users.insertOne({ //1건을 위한 명령어
    "name" : "sue"
  })
  db.users.insertMany([ //다건을 위한 명령어(개발 오류를 줄이기위한 명령어)
    {"name" : "sue"},
    {"name" : "park"},
    {"name" : "kim"},
  ])

10. 테이블 Update

  db.users.update( // 1건만 업데이트함 (다건 X)
    { name : "sue"}, //조건
    {
     "name" : "sue", //업데이트 내용
     "rating" : 1,
     "score" : 1,
    }
  )
  db.users.update( //위와 같은 방식으로 update한 것과 동일한 결과
    { name : "sue"}, //조건
    {
     $set:
      {
        "name" : "sue", //업데이트 내용
        "rating" : 1,
        "score" : 1,
      }
    }
  )
  db.users.update( 
    { name : "sue"}, //조건
    {
     "name" : "sue", //업데이트 내용
     "rating" : 1,
     "score" : 1,
    },
   { upsert : true } (데이터가 있으면 update, 없으면 insert)
  )
  db.users.updateOne( //한건만 업데이트 3.2버전에서 추가
    { name : "sue"}, //조건
    {
     "name" : "sue", //업데이트 내용
     "rating" : 1,
     "score" : 1,
    },
  )
  db.users.updateMany( //다건 업데이트 3.2버전에서 추가
    { name : "sue"}, //조건
    {
      $set:
       {
         "name" : "sue", //업데이트 내용
         "rating" : 1,
         "score" : 1,
       }
    }
  )
  db.users.update(
    { name : "sue"}, //조건
    {
      $set:
       {
         "name" : "sue", //업데이트 내용
         "rating" : 1,
         "score" : 1,
       }
    },
    { multi : true } //해당되는 모든 데이터가 업데이트됨
  )

11. 테이블 remove

  db.users.remove({ "name" : "sue" }) //sue를 만족하는 모든 데이터 삭제
  db.users.remove({}) //콜렉션의 모든 데이터 삭제
  db.users.deleteOne({ //1건만 삭제
    name : "Andy"
  })
  db.users.deleteMany({ // 다건 Andy 필드 모두 삭제
    name : "Andy"
  })

12. Group 함수

  • aggregate : 합계, 총계
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 count필드에 필드수를 합산하여 보여줌
       count:{$sum}
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 합산을 보여줌
       sum : {$sum : "$likes"}
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 평균을 보여줌
       avg : {$avg : "$likes"} 
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 최소값을 보여줌
       min : {$min : "$likes"} 
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 최대값을 보여줌
       max : {$max : "$likes"} 
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 첫번째값을 보여줌
       first : {$first : "$likes"} 
     }
       } 
      ])
      db.board.aggregate([
       {
     $group:{
       id : "$by_user", // by_user기준으로 sum필드의 likes필드의 첫번째값을 보여줌
       last : {$last : "$likes"} 
     }
       } 
      ])
    

13. 페이지 처리 기법

  • skip과 limit을 사용
    db.board.find().skip(0).limit(5) //0부터 시작해서 5건을 가져옴
    db.board.find().skip(5).limit(5) //5부터 시작해서 5건을 가져옴
    

14. Index생성 및 삭제

  db.board.createIndex({ subject : 1 }) // subject 필드에 오름차순으로 index생성
  db.board.getIndexes() // index조회
  db.board.dropIndex({ subject : 1 }) // subject 필드가 오름차순인 필드 삭제
  db.board.createIndex({ subject : 1, hits : -1 })  // 두개의 필드에 index 생성
  db.board.dropIndex({ subject : 1, hits : -1 }) 
  db.board.createIndex({ subject : 1 }, { unique : true })  // 유니크한 index를 생성, 이 상태에서 동일한 데이터를 insert할 때 오류남

댓글남기기