2013-01-22 34 views
0

我有一個名爲data的集合。每個文件看起來像這樣:Mongoid min聚合返回不正確的值

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

簡答

在你的情況,只是忽略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。如果你這樣做,一定要交聯。我想看看這個決議。