2011-09-23 65 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) } 

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