我有一个名为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似乎没有正常工作?
答案 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。如果你这样做,一定要交联。我希望看到解决方案。