집계 파이프라인
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로 보낼 필요가 없습니다.
빌더 DSL
Mongoid는 높은 수준의 DSL을 사용하여 집계 파이프라인 자체를 구성하는 데 제한적인 지원 을 제공합니다. 다음과 같은 집계 파이프라인 연산자가 지원됩니다.
파이프라인을 구성하려면 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
메서드는 $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"}}]