[TIL]NoSQL-MongoDB

Ina·2020년 7월 13일
0

TIL

목록 보기
1/20
post-thumbnail
post-custom-banner

Data → Information → DBMS(DataBase Management Software)

DBMS의 종류

  • RDBMS(관계형 데이터베이스) : 영구적인 데이터의 보관. 미리 정해진 테이블 포맷.
  • NoSQL-DBMS: not only structured query language, 즉 구조화되지 않은 방식으로 데이터베이스 관리 ⇒ 확장성이 큼. 대부분 무료 open 소스.

전통적으로 관계형 DB 사용해왔었음 ⇒ 모바일 혁명(데이터 발생량 폭발🤯 ) ⇒ 관계형은 구조적 한계성으로 인해 응답 속도 느림 ⇒ ✨ NoSQL 출현(대용량 데이터 처리 목적)

(but, NoSQL은 RDBMS의 대체재가 아닌, 상호 보완재 역할 - 데이터의 영구적 보관은 필수적이므로)

NoSQL - Document DB

  • collection: RDBMS의 테이블과 같은 역할. 문서목록(collection of documents)

  • 중첩문서 : 한 문서 내에 하위 문서를 하위 키값으로 구성할 수 있음

  • 파티셔닝 : 문서 DB를 수평/수직으로 분할하고 부분부분 여러 서버로 분산하여 성능 개선. nosql 탄생 자체가 빅데이터를 처리하기 위한 목적이었으므로 이걸 나누어 처리하여서 성능 개선하고자 함.

    	-수직 파티셔닝 : 컬럼단위로(key값) 독립 테이블로 분리.
    	-수평 파티셔닝(샤딩) : 100건을 50건/50건으로 뚝 짜르기.샤딩된 부분을 샤드라고 부름.

개발환경 세팅(MAC OS)

데이터베이스 CRUD

📎 데이터베이스 생성하기

<script> //script 태그는 무시해주세용
    > use sample1 :: 신규 몽고디비를 생성하거나 기존의 DB로 이동할 때
    switched to db sample1

    > db.createCollection('user'); :: 현재 선택된 DB에서 콜렉션을 생성
    { "ok" : 1 }

    > db.createCollection('userconfig');
    { "ok" : 1 } :: 생성완료

    > show collections ::현재 생성되어있는 컬렉션 조회
    user
    userconfig

    :: 컬렉션에 데이터 등록
    > db.user.save({userid:'test1',userpwd:'test1',email:'test1',married:0,createdAt:new Date()})
    WriteResult({ "nInserted" : 1 })  ::정상적으로 저장됨

    :: user 컬렉션 전체 조회(_id: primary key(자동 생성))
    > db.user.find({}); 
    { "**_id" : ObjectId("5f0bcb621310e0b16c3bdb51**"), "userid" : "test1", "userpwd" : "test1", "email" : "test1", "married" : 0, "createdAt" : ISODate("2020-07-13T02:48:02.720Z") }
    { "_id" : ObjectId("5f0bcb8e1310e0b16c3bdb52"), "userid" : "test1", "userpwd" : "test1", "email" : "test1", "married" : 0, "createdAt" : ISODate("2020-07-13T02:48:46.037Z") }
    { "_id" : ObjectId("5f0bcbbf1310e0b16c3bdb53"), "userid" : "test2", "userpwd" : "test2", "email" : "test2", "married" : 1, "createdAt" : ISODate("2020-07-13T02:49:35.784Z") }
    { "_id" : ObjectId("5f0bcbce1310e0b16c3bdb54"), "userid" : "test3", "userpwd" : "test3", "email" : "test3", "married" : 0, "createdAt" : ISODate("2020-07-13T02:49:50.708Z") }
    { "_id" : ObjectId("5f0bcbe01310e0b16c3bdb55"), "userid" : "test3", "userpwd" : "test3", "email" : "test3", "married" : 0, "createdAt" : ISODate("2020-07-13T02:50:08.559Z") }
    { "_id" : ObjectId("5f0bcbf51310e0b16c3bdb56"), "userid" : "test5", "userpwd" : "test5", "email" : "test5", "married" : 1, "createdAt" : ISODate("2020-07-13T02:50:29.372Z") }

    :: 컬렉션간의 관계가 있는 경우, 아래처럼 A컬렉션의 id 참조하여 B컬렉션에 데이터 저장할 수 있다.
    > db.userconfig.save({userobjid:ObjectId("5f0bcbbf1310e0b16c3bdb53"),config1:'value1',config2:'value2',configDate:new Date()})
    WriteResult({ "nInserted" : 1 })

    > db.userconfig.find({})
    { "_id" : ObjectId("5f0bcd551310e0b16c3bdb57"), "userobjid" : ObjectId("5f0bcbbf1310e0b16c3bdb53"), "config1" : "value1", "config2" : "value2", "configDate" : ISODate("2020-07-13T02:56:21.388Z") }
    _id는 본연의 id key값이고, userobjid는 참조값임! 구별하도록.
    </script>

📎 데이터베이스 조회하기

<script>
    :: 0:필요없음/ 1: 조회하기
    > db.user.find({},{_id:0,userid:1});
    { "userid" : "test1" }
    { "userid" : "test1" }
    { "userid" : "test2" }
    { "userid" : "test3" }
    { "userid" : "test3" }
    { "userid" : "test5" }

    ::필터링 해서 조회하기 
    > db.user.find({userid:'test1'},{_id:0,userid:1,email:1});
    { "userid" : "test1", "email" : "test1" }
    { "userid" : "test1", "email" : "test1" }

    ::정렬해서 조회하기(-1: 내림차순)
    > db.user.find({},{_id:0,userid:1,married:1,email:1}).sort({createdAt:-1});
    { "userid" : "test5", "email" : "test5", "married" : 1 }
    { "userid" : "test3", "email" : "test3", "married" : 0 }
    { "userid" : "test3", "email" : "test3", "married" : 0 }
    { "userid" : "test2", "email" : "test2", "married" : 1 }
    { "userid" : "test1", "email" : "test1", "married" : 0 }
    { "userid" : "test1", "email" : "test1", "married" : 0 }

    ::정렬해서 조회 & n개 만큼 가져오기
    > db.user.find({},{_id:0,userid:1,married:1,email:1}).sort({createdAt:-1}).limit(1);
    { "userid" : "test5", "email" : "test5", "married" : 1 }
    ::정렬해서 조회 & n개 만큼 가져오는데, n개 만큼 건너뛰고
    > db.user.find({},{_id:0,userid:1,married:1,email:1}).sort({createdAt:-1}).limit(1).skip(1);
    { "userid" : "test3", "email" : "test3", "married" : 0 }
</script>

📎 데이터베이스 수정하기 & 삭제하기

    <script>
    :: 데이터 수정하기
    > db.user.update({userid:'test1'},{$set:{username:'이나빵'}});
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    :: 결혼 안 한 사람 결혼 시키기 ( 왜 한명씩만 바뀌지? ㅇㅅㅇ)
    >  db.user.update({married:0},{$set:{married:1}});
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.user.find({});
    { "_id" : ObjectId("5f0bcb621310e0b16c3bdb51"), "userid" : "test1", "userpwd" : "test1", "email" : "test1", "married" : 1, "createdAt" : ISODate("2020-07-13T02:48:02.720Z"), "username" : "이나빵" }
    { "_id" : ObjectId("5f0bcb8e1310e0b16c3bdb52"), "userid" : "test1", "userpwd" : "test1", "email" : "test1", "married" : 0, "createdAt" : ISODate("2020-07-13T02:48:46.037Z") }
    { "_id" : ObjectId("5f0bcbbf1310e0b16c3bdb53"), "userid" : "test2", "userpwd" : "test2", "email" : "test2", "married" : 1, "createdAt" : ISODate("2020-07-13T02:49:35.784Z") }
    { "_id" : ObjectId("5f0bcbce1310e0b16c3bdb54"), "userid" : "test3", "userpwd" : "test3", "email" : "test3", "married" : 0, "createdAt" : ISODate("2020-07-13T02:49:50.708Z") }
    { "_id" : ObjectId("5f0bcbe01310e0b16c3bdb55"), "userid" : "test3", "userpwd" : "test3", "email" : "test3", "married" : 0, "createdAt" : ISODate("2020-07-13T02:50:08.559Z") }
    { "_id" : ObjectId("5f0bcbf51310e0b16c3bdb56"), "userid" : "test5", "userpwd" : "test5", "email" : "test5", "married" : 1, "createdAt" : ISODate("2020-07-13T02:50:29.372Z") }

    :: 삭제하기
    > db.user.remove({userid:'test1'});
    WriteResult({ "nRemoved" : 2 })
    
    </script>
    ```

   
profile
프론트엔드 개발자. 기록하기, 요가, 등산
post-custom-banner

0개의 댓글