문고리에서 객체의 단일 모음을 반환해야하지만 두 개의 검색어를 사용하여 결과를 가져와야하는 상황이 있습니다. 이러한 결과의 순서는 페이지 매김을하기 때문에 중요합니다.연합 2 문법 결과
여기서 제 쿼리 (카테고리와 가격대에 기초하여 목록)
my_listings = MoListing.where(criteria_a)
번째 쿼리 필터로서 제 쿼리의 결과를 사용할 필요가있다. 그래서 뭔가 같은 :
everything_else = MoListing.where(criteria_b)
그리고 노동 조합 결과 :
my_listings << everything_else
그리고 마지막으로, 페이지가 매겨진 결과를 반환은 :
my_listings.page(1).per(25)
내 문제의 일부가 몽고 쿼리가 아닌 것 같다 필요할 때까지 실행됩니다. 특정 시점에 쿼리 실행을 트리거 할 수있는 방법이 있습니까? 아니면이 결과 집합을 작성하는 데 또 다른 방법을 사용해야합니까? 더 많은 정보
제가 보는 동작과
업데이트는 어떤 반환됩니다 것은 listings
단지 결과 것입니다. 또한 everything_else
에는 예상 레코드 (my_listings에 48 레코드, 예상대로 everything_else에 52 레코드)가 포함되어 있음을 확인했습니다.
의견에 언급 된대로 .all
을 (를) 쿼리에 적용하면 아무런 영향이 없습니다.
10:57:00 web.1 | #<Mongoid::Criteria
10:57:00 web.1 | selector: {"price"=>{"$gte"=>25, "$lte"=>75}},
10:57:00 web.1 | options: {},
10:57:00 web.1 | class: MoListing,
10:57:00 web.1 | embedded: false>
에서 puts listings.inspect
결과는하지만, listings.count
는 48
결과 않습니다. 이 결과를 병합하는 어리석은 간단한 방법을 놓치고 있습니까? 그리고 하나의 콜렉션에서 결과를 얻으면, 다음에 오는 페이지 매김 함수에 어떻게 영향을 미칩니 까? 페이징에 kaminari
을 사용하고 있습니다.
아래 답변을 내 자신의 시행 착오 당 2
업데이트는, 나는 해결책 있지만 이상적인 하나가 될 to_a 발견했습니다. 대신 표준 배열을
#merge the results together as an Array
results = (listings.to_a | everything_else.to_a)
이것은 우리가 더 이상 몽고 기준으로 작업에 따라 변경되지해야 할 미나리를 통해 매김을 야기하지만,이 기능은 않습니다. 여기에 새로운 페이지 매김 방법이다 : - 나는 상당히 느린 시간 때를보고 있어요 큰 데이터 세트를 사용하여, 그러나 54ms
"debug":{"success":true,"pre_render_duration":54.808775999999995,"overall_duration":86.36554100000001,"count":25},"pagination":{"total_pages":4,"current_page":1}}
Kaminari.paginate_array(results).page(page).per(per_page)
(100 개) 기록의 작은 데이터 세트로 작업이 벌금과 멋쟁이 .to_a 메서드를 사용하여 이들을 결합합니다.이 예제는 사과에 대한 사과가 아니지만이 큰 차이점은 모든 것을 반환하는 to_a 문제와 관련이 있습니다. 카미나리는 더 많은 실제 데이터로 작업해야합니다 :
to_a가없는 나의 결과는 모든 레코드를 적용 기준 - 15ms의 두 결과 집합을 병합 to_a와
"debug":{"success":true,"pre_render_duration":15.107164,"overall_duration":18.267599,"count":25},"pagination":{"total_pages":81,"current_page":1}}
내 결과, - 415ms
"debug":{"success":true,"pre_render_duration":415.258199,"overall_duration":450.66537800000003,"count":25},"pagination":{"total_pages":81,"current_page":1}}
가 요약하면, 이것은 유효한 옵션이 아닙니다. 개별 데이터 집합을 개별적으로 반환하면큰 데이터 집합도 15ms 걸립니다. 그래서 성취해야 할 것은 조건을 함께 병합하여 단일 쿼리가 Mongo에 대해 실행되어 DB에서 페이지 매김이 발생할 수 있도록하는 것입니다. 있다.
는 SQL에서 나는 약
같은select
*
from
listings
where
field = "blah"
union all
select
*
from
listings
where
field <> "blah"
가 몽고에서이 작업을 수행하는 것이 가능 할 것?
# Let us say the listings is obtained using listing_query_params
listings = MoListing.where(listing_query_params)
# and everything else is from everything_else_query_params
everything_else = MoListing.where(everything_else_query_params)
results = [listings.to_a, everything_else.to_a].flatten
results.page(1).per(25)
이 당신이 원하는 무엇인가 :
문제의 일부를 의미합니까? 불완전한 결과가 있습니까? 목록 만 제공합니까 ?? 그래? 여기에서 문제가 무엇인지 자세히 설명해 주시겠습니까? –
액티브 레코드에서 트리거 실행은 .all 함수를 사용합니다. 쿼리 뒤에'.all'을 추가하면 거기에서 실행될 것이고 지연로드는 없을 것입니다. –