Mongoid:通过数组ID查找

fl0*_*00r 9 ruby ruby-on-rails mongodb mongoid

我通过MapReduce获取了一些id.我按照某些标准对这些ID进行了排序,现在我需要按照这个特定的顺序获取这些对象:

MyModel.find(ids)
Run Code Online (Sandbox Code Playgroud)

对?但它返回的对象不是存储ids的顺序.看起来像是一样的

MyModel.where(:_id.in => ids)
Run Code Online (Sandbox Code Playgroud)

它不会以与存储的id相同的顺序返回获取的对象.

现在我可以做到这一点

ids.map{|id| MyModel.find(id)}
Run Code Online (Sandbox Code Playgroud)

这将完成这项工作,但它会多次敲打数据库.

mu *_*ort 10

拥有所有对象后,您可以手动进行排序.像这样的东西:

ordering = { }
ids.each_with_index { |id, i| ordering[id] = i }
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] }
Run Code Online (Sandbox Code Playgroud)


njo*_*den 10

正在研究类似的问题,并找到了一个更简洁的解决方案:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) }
Run Code Online (Sandbox Code Playgroud)

基本上只是使用sort块来阻止元素的索引.