Docs Menu

애그리게이션을 통한 데이터 변환

이 가이드 에서는 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의 고급 DSL(도메인별 언어 )을 사용하여 집계 파이프라인 구성할 수 있습니다. DSL은 다음과 같은 집계 파이프라인 연산자를 지원합니다.

연산자
메서드 이름

group

project

unwind

앞의 연산자 중 하나를 사용하여 집계 파이프라인 만들려면 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"인 문서를 찾습니다.

  • unwindstates 배열 필드 분해하고 배열 의 각 요소에 대한 문서 출력합니다.

  • states 필드 값을 기준으로 문서를 그룹화하는 group

  • project은 파이프라인 _idstates 필드만 반환하도록 요청합니다.

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 설명서를 참조하세요.