DB/MongoDB 18

몽고DB 18강. aggregate $lookup 조인

몽고디비는 조인을 하기위해 사용하는 데이터베이스가 아닌데 몽고디비에서 조인을 지원해준다. 더미 데이터를 insertMany로 저장해주자. 나중에 크롤링할때도 for문 돌면서 save하면 너무 오래걸리기 때문에 벌크 컬렉터 saveAll 해야한다. 1. 더미데이터 use("cosdb"); var users = [ { "_id" : ObjectId("60986fbe93843236060071d2"), "username" : "ssar", "password" : "1234", "phone" : "0102222" }, { "_id" : ObjectId("6098700293843236060071d5"), "username" : "cos", "password" : "1234", "phone" : "0103333" }..

DB/MongoDB 2022.05.20

몽고DB 17강. aggregate 배열 표현식

배열 전개 표현식 use("cosdb"); var persons1 = { _id: 1, username : "ssar", posts : [ {id:1, title:"제목1", content:"내용1"}, {id:2, title:"제목2", content:"내용2"}, {id:3, title:"제목3", content:"내용3"}, ] } var persons2 = { _id: 2, username : "cos", posts : [ {id:1, title:"제목1", content:"내용1"}, {id:2, title:"제목2", content:"내용2"}, {id:3, title:"제목3", content:"내용3"}, ] } db.persons.insertOne(persons1); db.persons...

DB/MongoDB 2022.05.19

몽고DB 16강. aggregate

더미 데이터 넣기 use('cosdb'); for(let i=1; i < 21; i++) { db.users.insertOne({"i" : i, "username" : "user" + i, "age" : 12}); } db.users.find(); SELECT 연습을 할 건데 기본적인 CRUD는 스프링 부트에서 지원해주지만 복잡한 쿼리(고급 SELECT)를 수행하기 위해서는 쿼리를 직접 짜야한다. 이때 aggregate(집계 함수)를 사용해준다. 집계 함수의 포인트 : 파이프 라인 SELECT 한 결과를 가지고 다시 SELECT를 거치며 내가 원하는 결과를 도출할 수 있다. 몽고에서 파이프 라인을 도큐먼트 스트림이라고 부른다 1. match 일치 (RDB : WHERE) : 행을 추리기 2. projec..

DB/MongoDB 2022.05.16

몽고DB 15강. 스프링 연결

몽고 DB와 RDB의 차이 자바 세상에서 RDB로 값을 넣을 때는 DB에 오브젝트를 저장할 수 없었다. 자바는 오브젝트 안에 오브젝트를 넣을 수 있지만, DB는 테이블안에 테이블을 넣을 수 없기 때문이다. 이런 점이 상이했다. 그래서 ORM을 사용했다. JPA가 ORM이 아니라 ORM을 가지고 있는 것이다. 몽고 DB는 오브젝트 안에 오브젝트를 저장할 수 있다. 자바와 똑같이 오브젝트 안에 오브젝트를 넣을 수 있어서 DB에 그대로 넣을 수 있고 그대로 받아올 수 있다. 그래서 JPA가 필요 없다. 프로젝트를 생성하고 몽고 DB를 연결하자. 매우 간단하다. spring: data: mongodb: host: localhost port: 27017 database: greendb 나중에 샤딩을 구축하고 나서..

DB/MongoDB 2022.05.11

몽고DB 14강. 샤드키 설정

https://blog.naver.com/getinthere/222361419686 몽고DB 19강 - 샤딩 고급 1. 샤딩 키 선정 방법 - 샤딩 키는 직접 지정할 수 있는데 이때는 무조건 인덱스가 필요하다. 찾을때는 좋... blog.naver.com 1. 해시 (순차적인 단순 번호) Key base Shading 들어오는 데이터가 1부터 9일 때 순서대로 들어오는 번호 데이터를 잘 저장할 수 있다. _id:1 ~ 100 ~ 1000 샤드키 : _id 1 -> 해시 function -> asdf3n2jvasdv 변환 알아서 밸런스 맞춰서 샤드에 저장된다. 몽고DB에 데이터를 INSERT 하면 오브젝트 아이디가 생성되는데 timestamp 현재 시간을 기준으로 만들어진다. timestamp + rand..

DB/MongoDB 2022.05.09

몽고DB 13강. 샤딩 시스템 구성

1. shard 폴더 생성 mkdir c:\mongolab\shard1\r1 mkdir c:\mongolab\shard1\r2 mkdir c:\mongolab\shard1\r3 mkdir c:\mongolab\shard2\r1 mkdir c:\mongolab\shard2\r2 mkdir c:\mongolab\shard2\r3 mkdir c:\mongolab\shard3\r1 mkdir c:\mongolab\shard3\r2 mkdir c:\mongolab\shard3\r3 폴더가 잘 생성되었는지 확인해보자. cd c:\mongolab dir 2. config 서버 저장 폴더 생성 (shard에 대한 메타 데이터를 가지고 있는 서버) mkdir c:\mongolab\config\r1 mkdir c:\mon..

DB/MongoDB 2022.05.06

몽고DB 12강. 샤딩

하둡 : 대용량 데이터를 분석할 수 있는 플랫폼 데이터를 모을 때 기본적으로 분산 처리한다. 수천대의 분산된 컴퓨터에 대용량 파일을 저장할 수 있는 기능을 제공하는 분산 파일 시스템(HDFS; Hadoop File System) 1000mB 동영상 10개를 저장할 때 5개의 컴퓨터에 분산저장을 한다고 하면 동영상 10개를 2개씩 나눠서 저장하는게 아닌 1000mB를 200mB씩 나눠서 분산 저장하는 개념이다. 분산 저장을 하둡이 해준다. 분산된 데이터를 다시 합치기 위해서는 하둡이 메타 데이터를 알고 있어야 한다. 어디에 얼마만큼 저장되어 있는지 알아야 동영상을 실행하기 위해 모을 수 있기 때문이다. 분산 저장한 데이터를 다시 합치는 것을 맵 리듀스라고 한다. 우리가 사용하려는 몽고DB도 마찬가지로 분산..

DB/MongoDB 2022.05.04

몽고DB 11강. 리플리카 셋 실습, 저널링

https://blog.naver.com/getinthere/222302852437 몽고DB 6강 - 리플리카 셋 한 개의 Primary 서버와 두 개의 Secondary 서버로 구성됨. Primary 서버에서 데이터를 받으면 Seconda... blog.naver.com 1. mobaXterm 실행 터미널 창 여러개 띄우는것보다 mobaXterm의 탭으로 서버 여러개 띄우는게 편하다. cmd shell로 띄울 수도 있다. 우클릭해서 cmd 선택 2. 폴더 생성 Windows 경로 mkdir c:\mongo mkdir c:\mongo\var1 mkdir c:\mongo\var2 mkdir c:\mongo\var3 Linux 경로 mkdir /home/mobaxterm/mongo mkdir /home/mo..

DB/MongoDB 2022.05.03

몽고DB 10강. 레플리카 셋

레플리카 셋을 구성하는 3개의 서버는 서로 다 내부적으로 스레드가 돌고 있다. 연결되어있는 애랑 나랑 가지고 있는 데이터가 같은지 체크하는 스레드이다. 양쪽으로 비교해서 가지고있는 데이터가 같으면 동기화가 잘된 것이다. 이렇게 비교하는 주기가 짧다. 길면 해킹당할 수 있기 때문이다. 만약 하나의 서버에 바보 데이터를 천재로 해킹하여 바꿨을 때 오른쪽에 너 천재야? 물어봐서, 아니 바본데? 스코어 1:1 왼쪽에 너 천재야? 물어봐서, 아니 바본데? 스코어 2:1 천재라는 데이터가 바보로 동기화된다. 그렇기 때문에 한, 두대로는 만들지 않는다. 항상 3대 이상으로 만든다. 무결성과 신뢰성을 지키기 위해! 이때 내부적으로 돌고 있는 스레드를 heartbeat라고 한다. 이 heartbeat 스레드는 2초마다 ..

DB/MongoDB 2022.05.03

몽고DB 9강. 인덱스 개념

인덱스가 없으면 SELECT 할 때 풀 스캔을 하게 된다. _id는 기본적으로 생성되는 인덱스이고 도큐먼트를 가리키는 유일한 키 값(PK)으로 사용된다. 이 키 값은 해시로 만들어진다. 컬렉션을 posts라고 하고, 문서 하나를 post라고 해보자. 하나의 게시글은 여러 개의 댓글을 가질 수 있다. 즉, 필드에 comments 컬렉션을 가지고 있을 수 있다. 그리고 이 컬렉션 안에는 comment 문서를 가지고 있다. 8번 게시글만 댓글을 가지고 있을 때 8번 게시글을 SELECT 할 때 comments 컬렉션도 같이 나온다. 만약 전체 댓글처럼 댓글만 찾고 싶을 때는 게시글을 일일이 하나씩 들어가면서 댓글을 가지고 있나 찾아볼 수 없기 때문에 원본 데이터를 따로 하나 만들어준다. 이때 중복해서 원본데이..

DB/MongoDB 2022.05.02