본문 바로가기

MongoDB

(15)
[MongoDB] 백업 및 복구 MongoDB 서버는 다인 레플리카 셋뿐만 아니라 샤딩된 클러스터 구성으로도 구축할 수 있다. 단일 레플리카 셋일 때는 다른 RDMBS와 동일하게 단일 서버의 백업만 고려하면 된다. 하지만 샤딩된 클러스터 구성일 때는 여러 샤드 간의 데이터 저장 시점을 동기화해야 하는 어려움이 있다. 그뿐만 아니라 컨피그 서버와 샤드 서버의 동기화 문제( 동일 시점 백업 )도 샤딩된 클러스터의 백업에 있어서 상당히 까다로운 문제일 것이다. 여기에서는 완벽한 백업 및 복구 방법은 아니지만, 가능한 몇 가지 방법을 살펴보겠다. STEP#01. mongodump와 mongorestore를 이용한 놀리 백업 복구 #01. mongodump 백업 mongodump는 MongoDB에서 공식적으로 제공되는 유일한 백업 도구인데, 안..
[MongoDB] 한글 전문 검색 수행하기 STEP#01. 한글과 전문 검색 전문 검색을 수행하기 위한 쿼리의 기능도 중요하지만, 전문 인덱스를 어떻게 구성하는지도 매우 중요하다. 도큐먼트가 저장될 때, 각 필드의 값을 분석해서 전문 인덱스를 구성하는 부분을 일반적으로 전문 파서( Parser )라고 한다. 전문 파서가 문장을 어떻게 검색 단위의 단어로 분리하고 가공하는지에 따라서 검색 결과라 천차 만별이 될 수도 있다. MongoDB 서버의 전문 인덱스는 주요 언어에 대해서는 형태소 분석( Stemming ) 작업을 거쳐서 각 단어의 원형을 인덱스에 저장한다. 하지만 안타깝게도 한국어나 중국어 그리고 일본어 등에 대한 형태소 분석 기능은 제공하지 않는다. MongoDB가 사용하는 형태소( Snowball, http://snowball.tarta..
[MongoDB] 전문검색( Fulltext Search ) STEP#01. 전문 검색 전문검색이란? • 여러 문서에서 특정의 문자열을 검색하는 것 • 여러 문서에 걸쳐 문서에 포함되는 전문을 대상으로한 검색 RDBMS 처럼 MongoDB 서버도 전문 검색을 위해서 전문 검색 인덱스와 전문 검색을 위한 쿼리 문법을 제공하고있다. 우선 MongoDB의 전문 검색을 사용하는 방법을 간단히 살펴보자. // 전문 검색 예제 데이터 저장 mongo> db.stores.insertMany( [ { _id : 1, name : "Java Hut", description : "Coffee and cakes" } , { _id : 2, name : "Burger Buns", description : "Gourmet hamburgers" } , { _id : 3, name : "C..
[MongoDB] 확장 검색 쿼리 - 집계 파이프 라인연산자 종류 파이프라인에서 사용할 수 있는 연산자를 종류별로 나눠서 구분해 보자. STEP#01. 문자열 연산자 $concat 연산자 $concat 연산자는 두 개 이상의 문자열을 하나의 문자열로 연결한다. 예시> { $concat : { "$ltem", "-", "$description"] } $indexOfBytes 연산자 $indexOfBytes 연산자는 바이트 수로 인덱스를 반환한다. 예시> { $indexOfBytes : [ "$Desk", "-"] } $indexOfCP 연산자 $indexOfCP 연산자는 문자열에서 특정 문자가 처음 생겼을 때 인덱스 코드 포인트( CP )에서 찾아내면 필드내의 문자열을 분석하는 데 도움이 된다. 예시> { $indexOfCP : [ "$Desk", "-" ] } 위 쿼리..
[MongoDB] 확장 검색 쿼리 - $facet 스테이지 쇼핑몰처럼 많은 상품을 판매하는 사이트를 경험해본 개발자라면 다양한 기준( 가격대별로 또는 제품의 특성 )별로 상품의 개수를 그룹핑해서 보여주고 있고, 특정 그룹을 선택하면 다시 하위의 다른 기준으로 상품을 그룹핑해서 보여주는 기능을 개발해본 적이 있을 것이다. 아마도 이 기능을 구현하기 위해서 여러개의 쿼리를 작성하고 그 결과를 응용 프로그램에서 조합해서 화면에 출력하도록 하는 작업을 많이 했을 것이다. 이런 기능을 "Facet Query" 라고 하는데, 일반적인 RDBMS에서는 하나의 쿼리로 다양한 기준의 그룹핑 쿼리를 수행할 수 없다. 하지만 MongoDB 3.4 버전부터는 $facet 스테이지를 이용해서 상품을 가격대별로 그리고 카테고리 별로 한번에 그룹핑해서 개수를 가져올 수 있다. Facet ..
[MongoDB] 확장 검색 쿼리 - $lookup과 $graphLookup 스테이지 $lookup과 $graphLookup 스테이지는 Aggregation 쿼리의파이프라인에서 사용할 수 있는 조인 기능이다. $lookup과 $graphLookup 스테이는 FIND 쿼리에서는 사용할 수 없으며, Aggregation에서만 사용할 수 있다. 아래 그림과 같이 컬렉션이 샤딩돼 있지 않다면 $lookup과 $grapLookup 스테이지를 조인의 용도로 사용하는 데 있어서 어떤 제약 사항도 없다. 하지만 샤딩된 클러스터에서는 조인으로 연결되는 컬렉션이 샤딩되지 않은 경우에만 $lookup과 $graphLookup 스테이지를 사용할 수 있다. 즉 로컬 컬렉션( 조인의 드라이빙 테이블 )은 샤딩 여부와 관계없지만, 외래 컬렉션(조인 드리븐 테이블)은 샤딩되지 않은 컬렉션만 사용할 수 있다. 그런데 ..
[MongoDB] 확장 검색 쿼리 - Aggregation 파이프라인 최적화 MongoDB의 Aggregation은 각 스테이지가 순차적으로 처리되며, 그 결과를 다음 스테이지로 전달하면서 사용자의 요청을 처리한다. 그래서 각 스테이지들의 배열 순서는 처리 성능에 많은 영향을 미친다. 예를 들어, 필요한 도큐먼트만 필터링 하는 스테이지는 데이터를 그룹핑하는 스테이지보다 앞쪽에 위치해야 그룹핑해야 할 도큐먼트의 건수를 줄일 수 있고, Aggregation의 성능을 높일 수 있다. MongoDB 서버도 내부적으로 이러 형태의 기본적인 최적화 기능을 내장하고 있는데, 여기에서는 MongoDB가 어떤 최적화를 자동으로 처리할 수 있는지와 어떤 최적화가 불가능한지 살펴보겠다. 또한 MongoDB 서버가 Aggregation의 최적화를 해준다고 하더라도 Aggregation의 스테이지 구성..
[MongoDB] 확장 검색 쿼리 - Aggregation 파이프라인 스테이지(Pipline Stage)와 표현식 Aggregation의 파이프 라인은 스테이지의 배열로 작성되며, MongoDB 서버가 지원하는 스테이지는 다음과 같이 다양한 연산 과정들이 있다. 스테이지 설명 $project 입력으로 주어진 도큐먼트에서 필요한 필드만 선별해서 다음 스테이즈로 넘겨주는 작업을 처리한다. 물론 기존의 필드 이름을 변경하거나 필드를 제거하는 처리도 가능하다. $addFields 입력으로 주어진 도큐먼트에 새로운 필드를 추가한다. $replaceRoot 입력으로 주어진 도큐먼트에서 특정 필드를 최상위 도큐먼트로 만들고, 나머지는 버린다. $match 컬렉션 또는 직전 스테이지에서 넘어온 도큐먼트에서 조건에 일치하는 도큐먼트만 다음 스테이지로 전달한다. $redact 도큐먼트의 각 필드 또는 서브 도큐먼트의 포맷이 다양한 경..
[MongoDB] 확장 검색 쿼리 - 범용 Aggregation MongoDB의 Aggregation은 단일 목적 뿐만 아니라 다양한 서비스 요건을 위해서 사용자가 직접 작업 내용을 구현할 수 있도록 일반적인 Aggregation 기능도 제공하고 있다. 이를 범용 Aggregation이라고 하는데, 범용 Aggregation은 사용자가 필요한 데이터 가공 작업을 직접 작성해야 한다. 이때 데이터를 가공하는 작업은 스테이지( Stage )라는 단위 작업들로 구성되며, 데이터는 이렇게 작성된 스테이지들을 하나의 관( Pipeline ) 처럼 흘러가면서 원하는 형태의 데이터로 변환된다. 그래서 스테이지를 파이프라인( Pipeline )이라고도 한다. MongoDB 서버의 각 스테이지는 입력과 출력을 가지며, 사용자가 정의한 각 스테이지는 출력과 입력이 서로 파이프로 연결돼..
[MongoDB] 확장 검색 쿼리 - Aggregation의 목적 및 작동방식 MongoDB의 Find명령으로는 데이터를 그룹핑해서 특정 조건에 일치하는 도큐먼트의 개수를 확인한다거나 하는 복잡한 처리는 수행할 수 없었다. MongoDB의 Aggregation은 FIND 명령으로는 처리할 수 없는 복잡한 데이터 분석 기능들을 제공하는데, 일반적으로 SQL에서 GROUP BY 절로 처리할 수 있는 기능들ㅇ르 샤딩된 환경에서 실행할 수 있게 해준다. #01. Aggregation의 목적 MongoDB 서버는 이미 맵리듀스라는 분석기능을 가지고 있는데, MongoDB에서 새롭게 Aggregation 기능을 도입한 데이는 대표적으로 두 가지 이유를 생각할 수 있다. 첫 번째는 간단한 분석 쿼리에도 자바스크립트를 이용해서 맵리듀스 프로그램을 작성해야 한다. 자바스크립트 기반의 맵리듀스는 많..