2011-09-23 102 views
8

我通過MapReduce獲取了大量的ID。我已經按照某些標準對這些ID進行了排序,現在我需要按以下順序獲取這些對象:Mongoid:通過ID數組查找

MyModel.find(ids) 

對不對?但它返回的對象不是按照ID存儲的順序。看起來像

MyModel.where(:_id.in => ids) 

它不會以與存儲的ID相同的順序返回提取的對象。現在

我能做到這一點

ids.map{|id| MyModel.find(id)} 

這將做的工作,但它會敲數據庫很多很多次。

回答

9

您可以在擁有所有物品後手動進行排序。事情是這樣的:

ordering = { } 
ids.each_with_index { |id, i| ordering[id] = i } 
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] } 
+1

它是更快然後從數據庫中獲取每個項目? – fl00r

+0

@ fl00r:應該是,只需一個MongoDB訪問權即可獲取模型和一個簡單的排序(使用內置的Schwartzian變換),以便按照所需的順序獲取事物。數據庫訪問通常是昂貴的部分。嘗試對它進行基準測試,如果沒有真實數據的訪問就很難保證。 –

+0

@ muistooshort,我正面臨類似的問題。一般來說,將db命中最小化是更好的做法嗎? –

10

正在對類似的問題,並發現多一點簡潔的解決方案:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) } 

基本上只是使用排序塊絆住元素的索引。