Mongoid:通过ID数组查找

10

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

MyModel.find(ids)

是吗?但它返回的对象并不按存储的ID顺序排列。看起来这只是和...一样。

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

这不会按存储的id顺序返回获取到的对象。

现在我可以这样做

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

这个方法可以完成任务,但会对数据库进行多次访问。

2个回答

12

我曾经遇到一个类似的问题,发现了一个更加简洁的解决方案:

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

基本上只是使用排序块来捕获元素的索引。


11

在获取完所有对象后,您可以手动排序。类似这样:

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

1
它比从数据库中获取每个项目更快吗? - fl00r
@fl00r:应该可以,只需要一个MongoDB访问来获取模型,然后使用简单的排序(带有内置的Schwartzian Transform)来按所需的顺序获取内容。数据库访问通常是昂贵的部分。尝试进行基准测试,没有真实数据的情况下很难保证任何结果。 - mu is too short
@muistooshort,我遇到了类似的问题。一般来说,减少数据库访问次数只会是更好的实践,这是真的吗? - Kevin Brown
1
@Kevin:通常来说,数据库查询次数越少越好。理想情况下,您应该能够以数据库可以理解的方式表示排序条件,在SQL中,您可以使用“order by case ... end”来内联查找表,但MongoDB并不那么灵活,因此您必须在数据库外部自己完成它。 - mu is too short
@muistooshort,我对此很感兴趣,但是允许返回冗余的ID...可能吗? - Kevin Brown
@Kevin:可能是有可能的,但我不确定你的确切情况是什么。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接