2020.코딩일지
[데이터베이스]NoSQL:MongoDB = NoSQL도큐먼트DB[BEB 6th] 본문
코드스테이츠 블록체인 부트캠프 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>"}
- {}중괄호로 시작하고 끝나기.
- 필드와값은 :콜론으로 분리, 쌍은 ,쉼표로 구분
- 문자열은 “쌍따옴표로 감싸기
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([ ])를 사용하면
- 도큐를 필터링 하지 않고 그룹으로 데이터를 집계하거나 데이터를 수정할 수 있다.
- 데이터 찾기 및 프로젝션 없이 작업을 수행하거나 계산할 수 있다.
- [ ]대괄호를 이용해 배열을 인자로 사용한다. 요소의 순서대로 작업을 하기 때문이다.
$match $group $project
필터링 단계없이 원본데이터를 바로 받아오는 경우에는
데이터 요약, 계산 및 그룹화를 수행할 때 원본 데이터를 수정하지 않는다.
필터링 단계가 있다면
이를 통과한 데이터를 다음 단계에서 작업한다.
$group : 더 많은 양적 분석을 수행할 수 있다.
'WebServer&DB&CTI' 카테고리의 다른 글
[Docker]리눅스기반, 왜도커인가[BEB 6th] (0) | 2022.08.19 |
---|---|
[인증/보안]OAuth2.0[BEB 6th] (1) | 2022.08.15 |
[DB]SQL Advanced-[BEB 6th] (0) | 2022.08.09 |
[DB]im-sprint-cmarket-database/Cmarket ServerAPI[#MVC패턴][BEB 6th] (0) | 2022.08.09 |
[DB]im-sprint-cmarket-database:test파일안돌고뭐해에러[BEB 6th][nodemon] app crashed - waiting for file changes before starting... (0) | 2022.08.09 |