애그리게이션을 통한 데이터 변환
개요
이 가이드 에서는 Mongoid를 사용하여 집계 작업을 수행하는 방법을 학습 수 있습니다.
애그리게이션 작업은 MongoDB 컬렉션의 데이터를 처리하고 계산된 결과를 반환합니다. Query API의 일부인 MongoDB 애그리게이션 프레임워크는 데이터 처리 파이프라인 개념을 모델로 합니다. 문서는 하나 이상의 단계를 포함하는 파이프라인에 들어가고, 이 파이프라인은 문서를 애그리게이션된 결과로 변환합니다.
애그리게이션 작업은 조립 라인이 있는 자동차 공장과 유사하게 작동합니다. 조립 라인에는 특정 작업을 수행하기 위한 특수 도구를 갖춘 스테이션이 있습니다. 예를 들어, 자동차를 만들 때 조립 라인은 프레임에서 시작됩니다. 그런 다음 자동차 프레임이 조립 라인을 이동할 때 각 스테이션은 별도의 부품을 조립합니다. 그 결과는 변형된 최종 제품, 즉 완성된 자동차입니다.
조립 라인은 집계 파이프라인, 개별 스테이션 은 집계 단계, 특수 도구 는 표현식 연산자, 완제품 은 집계된 결과 를 나타 냅니다 .
집계 및 찾기 연산 비교
다음 표에는 찾기 작업으로 수행할 수 있는 다양한 작업과 집계 작업으로 수행할 수 있는 작업이 나열되어 있습니다. 집계 프레임워크는 데이터를 변환하고 조작할 수 있는 확장된 기능을 제공합니다.
작업 찾기 | 집계 작업 |
---|---|
Select certain documents to return Select which fields to return Sort the results Limit the results Count the results | Select certain documents to return Select which fields to return Sort the results Limit the results Count the results Rename fields Compute new fields Summarize data Connect and merge data sets |
Mongoid 빌더
Mongoid의 고급 DSL(도메인별 언어 )을 사용하여 집계 파이프라인 구성할 수 있습니다. DSL은 다음과 같은 집계 파이프라인 연산자를 지원합니다.
앞의 연산자 중 하나를 사용하여 집계 파이프라인 만들려면 Criteria
인스턴스 에서 해당 메서드를 호출합니다. 메서드를 호출하면 Criteria
인스턴스 의 pipeline
속성에 집계 작업이 추가됩니다. 집계 파이프라인 실행 하려면 pipeline
속성 값을 Collection#aggregate
메서드에 전달합니다.
예시
다음 클래스에 의해 모델링된 문서가 있는 컬렉션 이 포함된 데이터베이스 가정해 보겠습니다.
class Tour include Mongoid::Document embeds_many :participants field :name, type: String field :states, type: Array end class Participant include Mongoid::Document embedded_in :tour field :name, type: String end
이 예시 에서 Tour
모델은 투어의 이름과 여행하는 주를 나타내고 Participant
모델은 투어에 참여하는 사람의 이름을 나타냅니다.
다음 예시 다음 집계 작업을 사용하여 참가자가 방문한 상태를 출력하는 집계 파이프라인 만듭니다.
match
:participants.name
필드 값이"Serenity"
인 문서를 찾습니다.unwind
은states
배열 필드 분해하고 배열 의 각 요소에 대한 문서 출력합니다.states
필드 값을 기준으로 문서를 그룹화하는group
project
은 파이프라인_id
및states
필드만 반환하도록 요청합니다.
criteria = Tour.where('participant.name' => 'Serenity'). unwind(:states). group(_id: 'states', :states.add_to_set => '$states'). project(_id: 0, states: 1) @states = Tour.collection.aggregate(criteria.pipeline).to_json
[{"states":["OR","WA","CA"]}]
빌더 없는 애그리게이션
Collection#aggregate
메서드를 사용하면 집계 작업 배열 을 전달하여 해당 빌더 메서드가 없는 집계 게이션 작업을 실행 수 있습니다. 이 메서드를 사용하여 집계 을 수행하면 Mongoid::Document
모델 인스턴스가 아닌 원시 BSON::Document
객체가 반환됩니다.
예시
다음 클래스에 의해 모델링된 문서가 있는 컬렉션 이 포함된 데이터베이스 가정해 보겠습니다.
class Band include Mongoid::Document has_many :tours has_many :awards field :name, type: String end class Tour include Mongoid::Document belongs_to :band field :year, type: Integer end class Award include Mongoid::Document belongs_to :band field :name, type: String end
다음 예시 2000
이후 투어를 진행했으며 최소 1
개의 수상 경력이 있는 모든 밴드를 조회 집계 파이프라인 만듭니다.
band_ids = Band.collection.aggregate([ { '$lookup' => { from: 'tours', localField: '_id', foreignField: 'band_id', as: 'tours', } }, { '$lookup' => { from: 'awards', localField: '_id', foreignField: 'band_id', as: 'awards', } }, { '$match' => { 'tours.year' => {'$gte' => 2000}, 'awards._id' => {'$exists' => true}, } }, {'$project' => {_id: 1}}, ]) bands = Band.find(band_ids.to_a)
[ {"_id": "...", "name": "Deftones" }, {"_id": "...", "name": "Tool"}, ... ]
팁
앞의 예시 출력 문서의 _id
필드 만 프로젝션합니다. 그런 다음 프로젝션된 결과를 사용하여 문서를 찾아 Mongoid::Document
모델 인스턴스로 반환합니다. 이 선택적 단계는 집계 파이프라인 실행 데 필요하지 않습니다.
추가 정보
집계 연산자의 전체 목록을 보려면 애그리게이션 연산자를 참조하세요.
집계 파이프라인을 어셈블하는 방법에 대해 알아보고 예제를 보려면 집계 파이프라인을 참조하세요.
파이프라인 단계 생성에 대해 자세히 알아보려면 애그리게이션 단계를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.