Mongoid min聚合返回不正确的值

时间:2013-01-22 01:52:33

标签: ruby-on-rails ruby mongodb mongoid

我有一个名为data的集合。每个文档看起来都像这样:

x: {"value"=>1358747699.6922424}, y: {"value"=>17.9}

另外,我有x.value和y.value的索引。使用内置的mongoid聚合.min,我想得到最小的y值。我试过这样做:

data.min(:'y.value')

它返回16.2,我知道这是不正确的,它应该是14.4,我可以证明:

data.map{|d| d['y']d['value']}.sort.first

返回14.4

或者:

data.order_by([:'y.value', :asc]).limit(1).first['y']['value']

还返回14.4

所以我无法弄清楚为什么.min似乎没有正常工作?

1 个答案:

答案 0 :(得分:1)

简答

在您的情况下,只需忽略Mongoid提供的min函数。请使用您提出的那个:

data.order_by([:'y.value', :asc]).limit(1).first['y']['value']

<强>解释

我做了一些深入研究Mongoid聚合是如何实际实现的。原来他们使用运行整个集合的map_reduce[1]

您编写的查询应该更有效率,因为它可以使用您在y.value上构建的索引。这意味着1个索引查找与整个集合(更不用说它实际上有效......)。

检查MongoDB探查器以确保实际使用索引。 [2]

您实际提出的问题

至于min失败的确切原因,我感到很茫然。在没有看到您的数据的情况下,我看不出任何原因导致基础map_reduce失败。也许它与嵌入字段有关,或者可能没有为某些对象定义this.y.value

这是一个回馈开源的机会。尝试发帖到Mongoid issues board。如果你这样做,一定要交联。我希望看到解决方案。