2012-05-17 92 views
1

我有痕跡的表結構如下
id | country_iso | object_id | created_at
每個對象可以有多個條目的一個或多個國家。我需要弄清楚每個國家現在有多少物體。
我不能只按country_iso分組,因爲在這種情況下,我會得到每個國家的條目數量,但不是對象數量。
我無法按country_iso和object_id對其進行分組,因爲在這段時間內,我將獲得每個國家/地區中每個對象的條目數。分組查詢蒙戈和軌道

所以,似乎我必須得到每個對象的最後一項,然後按國家分組並獲得數量。此外,我需要避免最後一次輸入country_iso等於null的情況。因此,如果對象的最後一個條目爲空,我們必須在last和last之前獲得條目(因此,最新的條目不爲null country_iso)。

例子:

1 | US | 1 | 25.02.02 
2 | null | 1 | 26.02.02 
3 | UK | 2 | 25.02.02 
4 | UK | 3 | 25.02.02 
5 | UK | 4 | 25.02.02 
6 | US | 4 | 26.02.02 ` 

結果將提前任何想法

US | 2 
UK | 2 

感謝。
P.S .:請注意,有很多數據(每個對象超過10萬個,每個對象超過10個),它在遠程服務器上。所以,我無法獲取數據,並以某種方式在主服務器上使用ruby重新計算它們。

+0

100,000?如果你需要經常這樣做,你可能可以在Ruby中做到這一點......! –

+0

我必須做一次(至少它被要求作爲一次數據拉) – RaskolnikOFF

回答

0
MyCollection.where(country_iso: "US").count 
1

您將需要map-reduce或更短的組版本。

http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb

下面是在代碼中的鏡頭:

MyModel.collection.group(
    :key  => :country_iso 
    :initial => { :object_id_set => {} }, 
    :reduce => 'function (obj,prev) { prev.object_id_set[obj.object_id] = 1; }', 
    :finalize => 'function (final) { final.object_count = keys(final.object_id_set).length }' 
) 
0

一個不太聰明的辦法是濫用distinct ...

counts = MyModel.distinct(:country_iso).map do |country_iso| 
    count = MyModel.where(:country_iso => country_iso).distinct(:object_id).count 
    [country_iso, count] 
end 

...雖然這是每個國家1查詢。每個查詢可能不會是可怕的@ 1ms。

+0

有趣的思想,謝謝。但看起來不是很好,因爲在這種情況下,某個對象可能出現在每個國家的選擇中。對於我的例子,它將是'US => 2,null => 1,UK => 3' – RaskolnikOFF