0

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

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 似乎无法正常工作?

4

1 回答 1

1

简答

在您的情况下,只需忽略minMongoid 提供的功能。改用你想出的那个:

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

解释

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

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

检查 MongoDB 分析器以确保您的索引实际上正在被使用。[2]

你实际问的问题

至于min失败的确切原因,我不知所措。map_reduce如果没有看到您的数据,我看不出底层证券失败的任何原因。也许它与嵌入字段有关,或者可能this.y.value没有为某些对象定义。

这是一个回馈开源的机会。尝试发布到Mongoid 问题板。如果你这样做,一定要交联。我想看看这个解决方案。

于 2013-01-22T03:05:53.770 回答