我有一種情況,我需要從mongo返回一個對象集合,但需要使用兩個查詢來獲得結果。這些結果的順序很重要,因爲它們是分頁的。聯盟兩個mongo結果
這是第一個查詢:(基於類別和價格範圍清單)
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條記錄,正如預期的那樣,記錄中有52條記錄在everything_else中)。
將.all
應用於我在評論中提到的查詢時,不會產生任何影響。一個puts listings.inspect
結果
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>
然而,listings.count
不會導致48
。我是否錯過了合併這些結果的一些愚蠢的簡單方法?一旦我在一個系列中獲得了結果,這將如何影響後續的分頁功能。我正在使用kaminari
進行分頁。
更新2
每下面的答案和我自己的摸索,我發現to_a是一個解決方案,但不是一個理想的一個。這確實功能:
#merge the results together as an Array
results = (listings.to_a | everything_else.to_a)
這使得通過雷分頁必須改變,因爲我們不再與蒙戈標準的工作,而是一個標準的數組。這裏是新的分頁方法:
Kaminari.paginate_array(results).page(page).per(per_page)
有100條記錄一個小數據集工作,這是罰款和花花公子 - 54ms
"debug":{"success":true,"pre_render_duration":54.808775999999995,"overall_duration":86.36554100000001,"count":25},"pagination":{"total_pages":4,"current_page":1}}
然而,使用更大的數據集我看到顯著較慢的時候,使用.to_a方法來組合這些。雖然這些例子並不完全適用於蘋果,但這個大的差異指向的問題是to_a返回所有內容,迫使Kaminari使用更多的實際數據:
我的結果沒有to_a,只是返回所有記錄應用標準 - 15ms的
"debug":{"success":true,"pre_render_duration":15.107164,"overall_duration":18.267599,"count":25},"pagination":{"total_pages":81,"current_page":1}}
我的結果與to_a,合併兩個結果 - 415ms
"debug":{"success":true,"pre_render_duration":415.258199,"overall_duration":450.66537800000003,"count":25},"pagination":{"total_pages":81,"current_page":1}}
總之,這不是一個有效的選項。即使對於大數據集,也要分別返回每個數據集15ms,所以我認爲我需要完成的是將標準合併在一起,以便針對Mongo運行單個查詢,從而允許分頁發生在分貝上是。
在SQL我會做一些大致是
select
*
from
listings
where
field = "blah"
union all
select
*
from
listings
where
field <> "blah"
是否有可能做到這一點蒙戈?
你是什麼意思你的問題的一部分?你會得到不完整的結果嗎? 你只有列表嗎?是這樣嗎? 請詳細說明這裏有什麼問題? –
在Active Record中觸發執行的解決方案是使用.all函數。 只需在查詢後添加'.all',它們將在那裏執行,並且不會有延遲加載。 –