Docs Menu
Docs Home
/ / /
몽고이드
/

집계 파이프라인

이 페이지의 내용

  • 기본 사용법
  • 여러 컬렉션에 걸쳐 쿼리하기
  • 빌더 DSL
  • 그룹
  • 프로젝트
  • Unwind

Mongoid는 결과를 프로세스 하고 반환하는 작업 흐름을 구성하는 데 사용되는 MongoDB의 집계 파이프라인 을 노출합니다. 집계 파이프라인 은 더 이상 사용되지 않는 맵/리듀스 프레임워크 기능의 상위 집합입니다.

집계 파이프라인 은 동시에 여러 개의 참조된 연관 관계를 포함하는 쿼리에 사용될 수 있습니다:

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 이후 투어를 진행하고 하나 이상의 상을 수상한 밴드를 조회 하려면 다음을 수행할 수 있습니다.

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)

집계 파이프라인 은 Mongoid가 아닌 MongoDB 용 Ruby 운전자 에 의해 구현되므로 Mongoid::Document 모델 인스턴스가 아닌 원시 BSON::Document 객체를 반환합니다. 위 예시 에서는 _id 필드 만 프로젝션한 다음 전체 모델을 로드하는 데 사용됩니다. 대안은 이러한 프로젝션 을 수행하지 않고 원시 필드로 작업하는 것입니다. 이렇게 하면 두 번째 쿼리 (크기가 클 수 있음)에서 문서 ID 목록을 Mongoid로 보낼 필요가 없습니다.

Mongoid는 높은 수준의 DSL을 사용하여 집계 파이프라인 자체를 구성하는 데 제한적인 지원 을 제공합니다. 다음과 같은 집계 파이프라인 연산자가 지원됩니다.

  • $그룹

  • 프로젝트

  • $unwind

파이프라인을 구성하려면 Criteria 인스턴스에서 해당 집계 파이프라인 메서드를 호출합니다. 집계 파이프라인 작업이 Criteria 인스턴스의 pipeline 속성에 추가됩니다. 파이프라인을 실행하려면 pipeline 속성 값을 Collection#aggragegate 메서드에 전달합니다.

예를 들어 다음과 같은 모델이 있습니다.

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

참가자가 어떤 주를 방문했는지 확인할 수 있습니다.

criteria = Tour.where('participants.name' => 'Serenity',).
unwind(:states).
group(_id: 'states', :states.add_to_set => '$states').
project(_id: 0, states: 1)
pp criteria.pipeline
# => [{"$match"=>{"participants.name"=>"Serenity"}},
# {"$unwind"=>"$states"},
# {"$group"=>{"_id"=>"states", "states"=>{"$addToSet"=>"$states"}}},
# {"$project"=>{"_id"=>0, "states"=>1}}]
Tour.collection.aggregate(criteria.pipeline).to_a

group 메서드는 $ 그룹 집계 파이프라인 단계를 추가합니다.

필드 표현식은 Mongoid 기호 연산자 구문을 지원 합니다.

criteria = Tour.all.group(_id: 'states', :states.add_to_set => '$states')
criteria.pipeline
# => [{"$group"=>{"_id"=>"states", "states"=>{"$addToSet"=>"$states"}}}]

또는 표준 MongoDB 집계 파이프라인 구문을 사용할 수도 있습니다.

criteria = Tour.all.group(_id: 'states', states: {'$addToSet' => '$states'})

project 메서드는 $ 프로젝트 집계 파이프라인 단계를 추가합니다.

인수는 프로젝션 을 지정하는 해시여야 합니다.

criteria = Tour.all.project(_id: 0, states: 1)
criteria.pipeline
# => [{"$project"=>{"_id"=>0, "states"=>1}}]

unwind 메서드는 $unwind 집계 파이프라인 단계를 추가합니다.

인수는 기호나 string 로 지정할 수 있는 필드 이름이거나 해시 또는 BSON::Document 인스턴스 일 수 있습니다.

criteria = Tour.all.unwind(:states)
criteria = Tour.all.unwind('states')
criteria.pipeline
# => [{"$unwind"=>"$states"}]
criteria = Tour.all.unwind(path: '$states')
criteria.pipeline
# => [{"$unwind"=>{:path=>"$states"}}]

돌아가기

텍스트 검색