2020.코딩일지

[데이터베이스]NoSQL:MongoDB = NoSQL도큐먼트DB[BEB 6th] 본문

WebServer&DB&CTI

[데이터베이스]NoSQL:MongoDB = NoSQL도큐먼트DB[BEB 6th]

개발하는라푼젤 2022. 8. 11. 16:05
728x90
코드스테이츠 블록체인 부트캠프 6기 

 

  • 스키마와 데이터타입이 유연하다
  • key-value방식으로 빠르게 접근이 가능하다.
  • 개발자에게 쉬운 사용법, 프로토타입을 빨리 만들어야 할때.
  • 쉬운 유지보수, 관리 및 운영
  • 거대한 데이터들을 다룰 때, 엄청난 데이터 쓰기 성능이 필요할 때.
  • 엄청난 데이터 쓰기 성능이 필요할 때 유용하다
  • 고가용성

NoSQL의 장점=MongoDB의 장점

 

Atlas Cloud(아틀라스 클라우드)에 DB를 설정한다.

클러스터 배포 cluster deployment

인스턴스 Atlas Cloud(아틀라스 클라우드)에 DB를 설정한다.
클러스터 배포 cluster deployment
클러스터
clusters
인스턴스들의 모임 = 하나의 시스템
데이터를 저장하는 서버 그룹. 여러 대의 컴퓨터를 네트워크를 통해 연결하여 하나의 단일 컴처럼 동작하도록 제작한 컴
레플리카세트
replica set
단일 클러스터에서 각각의 인스턴스는 동일한 복제본을 갖고있으며 이 모음을 가리키는 말.
= 동일한 데이터를 저장하는 몇 개의 연결된 mongoDB인스턴스의 모음.(소수의 연결된 머신)
= 데이터의 사본을 저장하는 인스턴스의 모음! 인스턴스중 하나에 문제가 발생하더라도 데이터는 그대로 유지된 다.
나머지 레플리카세트의 인스턴스에 저장된 데이터로 작업이 가능하다.
(마치like 블록체인같다 분산)
  클러스터(서버그룹)를 이용하여 배포할 경우, 자동으로 레플리카세트가 생성,구성된다.
도큐먼트나 컬렉션을 변경할 경우, 변경된 데이터의 중복 사본이 레플리카세트에 저장된다.
서버 레플리카세트로 구성되어 있다
도큐먼트
Document
Field-Value(고유한식별자-데이터) 쌍으로 저장된 데이터 {<field>:<value>} 마치like객체
컬렉션
collection
MongoDB의 도큐먼트로 구성된 저장소. 일반적으로 도큐먼트 간의 공통 필드가 있다.
데이터베이스당 많은 컬렉션이 있고, 컬렉션 당 많은 도큐먼트가 있을 수 있다.

 


JSON(JavaScript Object Notation) : 읽기쉬우니까 (로컬머신으로)출력방법

장: 텍스트형식으로 읽기쉽고, 개발자친숙

단: 파싱이 느리다, 메모리비효율적사용, 데이터타입의 제약(csv도가능)

아틀라스 클러스터로 가져오기
mongoimport --uri"<atlas cluster URI>" --drop=<filename>.json
아틀라스 클러스터에서 로컬로 내보내기
mongoexport --uri"<atlase cluster URI>" --collection=<collection name> --out=<filename>.json
//해당 데이터베이스의 컬렉션 이름, 파일 이름까지 정확하게 작성 바람.

json형식으로 도큐를 작성하기 위한 조건.  {"<field1>":"<value1>", "<field2>":"<value>"}

  • {}중괄호로 시작하고 끝나기.
  • 필드와값은 :콜론으로 분리, 쌍은 ,쉼표로 구분
  • 문자열은 “쌍따옴표로 감싸기

JSON과 BSON

BSON(Binary JSON) : MongoDB에서는 이걸로 데이터를 저장,사용한다.

(다른시스템으로 내보낼때, 클라우드 데이터를 로컬머신으로 백업할 때)

장: JSON보다 효율적인 메모리사용, 빠르고, 가볍, 유연, 더많은데이터타입사용가능.

아틀라스 클러스터로 가져오기
mongorestore --uri"<atlas cluster URI>" --drop dump
아틀라스 클러스터에서 로컬로 내보내기
mongodump --uri"<atlas cluster URI>"
//별다른쿼리없음오예

dump→sample_supplies→less sales.bson

컴언어에 가까운 이진법으로 표현

 

 

내보낼때는 Atlas Cluster URI가 필요하다.(웹의 URI와 형식이 같고, username, password, cluster)

mongodump →[BSON형식의dump파일] mongorestore→[아틀라스 클러스터로 복원]


 

CREATE

insert()안에 {도큐담기} db.collection.insert({}) id는 자동할당! id로 도큐구별!

insert()안에 []배열로 {},{},{}도큐여러개 담기 db.collection.insert([{},{},{}]) 앞 인덱스에서 문제생기면 멈춰버림.

인덱스 순서로 작업실행!

insert()안에 []배열로 {},{},{}도큐여러개 담을때 작업순서 db.collection.insert([{},{},{}],{”ordered”:false})

`insert()`명령어의 순서옵션 추가

존재하지않는 collection을 지정하면 새로운 collection이 생성됨 ;ㅋ

`insertOne()`

`inserMany()`

`show dbs` //데이터베이스 리스트 확인

`show collections`

 

 

READ

db.collection.find() 전체 또는 일정 조건에 따라 데이터를 조회하는 방법, 조회한 데이터의 수를 세는 방법

db.collection_name.find(<{”state”:”NY”, 쿼리문2}>)

랜덤20개조회 it명령어 (iterate)

db.collection.find().pretty() //보기예쁘게

db.collection.find().count() //데이터 총 숫자

db.collection.findOne() //무작위 1개의 데이터만 조회

db.collection.findOne({”_id”:objectId(”sdfsfd”)}) //특정한 데이터만 조회하고싶을 때,고유값사용

 

 

UPDATE   MQL$연산자사용

updateOne 주어진 기준에 맞는 다수의 도큐 중 첫번째 도큐 하나만 업데이트

db.collection.updateMany({””:””},{”$set”:{”pop”:99}}) //$set 지정값으로 수정

존재하지 않는 필드를 잘못작성하면.. 그냥 추가되어버립니다…핳;ㅋ

updateMany 쿼리문과 일치하는 모든 도큐를 업데이트

db.collection.updateMany({””:””},{”$inc”:{”pop”:10}}) //$inc모두 10만큼 증가

$push 배열연산자 : 배열의 마지막 위치에 엘리먼트를 넣으며, 필드 타입이 배열로 바뀜.

 

DELETE

deleteOne 어진 기준에 맞는 다수의 도큐 중 첫번째 도큐 하나만 삭제 **좋은접근법!

deleteMany 쿼리문과 일치하는 모든 도큐를 삭제

컬렉션삭제시, db.collection_name.drop()

 

 

쿼리연산자는 데이터베이스대에서 데이터를 찾는 다양한 방법을 제공한다.

비교연산자를 이용해 특정 범위 내의 데이터를 찾을 수 있다.

  (기본연산자 &eq) $gt, $gte, $ne, $lt, $lte {<field>:{<operator>:<value>}}

논리연산자 (기본연산자 $and) $or $nor $not

표현연산자 하나 이상의 복잡한 작업 수행가능 $expr사용하면 변수와 조건문사용가능. 필드비교가능.

$ 필드의 값을 참조할 때 사용가능

배열연산자 $push $all(배열순서상관없이), $size:20(배열길이로)

배열연산자와 projection …어렵;;;@_@

쿼리 조건과 일치하는 항목을 반환할 때 프로젝션을 사용해 특정한 필드만을 결과로 가져올 수 있다.

db.collection.find({<query>},{<projection>}) 쿼리의 프로젝션에 사용가능한 $elemMatch

db.grades.find({”class_id”:431},{”scores”:{”$elemMatch”:{”score”:{”$gt”:85} }}}).pretty()

// class_id가 431인 도큐를 찾아, 그 도큐에서 $elemMatch의 조건에 따라(필드가존재하고, 조건에 맞는 요소가 있는 경우에만) projection해줘

지정된 쿼리와 일치하는 요소가 하나 이상 있는 배열필드를 가지고 있는 도큐를 찾을 수 있다.

그리고 지정된 기준과 일치하는 요소가 하나 이상 있는 배열 요소만 프로젝션 한다.

find명령의 쿼리 부분에 $elemMatch사용했기 때문에

결과로 배열이 있는 도큐요소의 type필드의 값이 extra credit인 도큐를 찾아라!

<프로젝션>이없기때문에 각 도큐의 모든 필드가 포함됨

db.collection.find({”scores”:{”$elemMatch”:{”type”:”extra credit”}}}).pretty()

// score배열에 type필드를 갖고 있고, 값이 extra credit인 학생을 찾는 쿼리를 작성.

 

배열과 서브 도큐 쿼리하기

특정 요소의 위치로 배열 필드를 쿼리하거나 서브 도큐먼트의 요소를 쿼리하기 위해서, .(dot notation)으로 지정한다.

db.collection.find({”field.0.other_field.also_a_field”:”value”})

정규식 연산자 $regex 일치시기려는 문자열 지정 {”$regex” : ”CEO”}

 

 

 

Aggregation Framework

데이터를 파이프라인에 따라 처리할 수 있는 MongoDB에서 사용하는 프레임워크!

MongoDB에서 데이터를 쿼리하는 가장 간단한 방법 중 하나가 aggregation framework.

aggregate로 MQL보다 다양한 쿼리를 작성가능! (계산, 재구성, 재정립)

순서대로 처리됨. 원본데이터를 수정하거나 변경하지 않음.

<syntax캡쳐>

aggregate([ ])를 사용하면

  1. 도큐를 필터링 하지 않고 그룹으로 데이터를 집계하거나 데이터를 수정할 수 있다.
  2. 데이터 찾기 및 프로젝션 없이 작업을 수행하거나 계산할 수 있다.
  3. [ ]대괄호를 이용해 배열을 인자로 사용한다. 요소의 순서대로 작업을 하기 때문이다.

$match $group $project

필터링 단계없이 원본데이터를 바로 받아오는 경우에는

데이터 요약, 계산 및 그룹화를 수행할 때 원본 데이터를 수정하지 않는다.

필터링 단계가 있다면

이를 통과한 데이터를 다음 단계에서 작업한다.

$group : 더 많은 양적 분석을 수행할 수 있다.

 

Comments