1

次の構造のトレースのテーブルがあります
id | country_iso | object_id | created_at
。各オブジェクトには、1 つ以上の国に対して多くのエントリを含めることができます。各国に現在いくつのオブジェクトがあるかを把握する必要があります。
country_iso でグループ化することはできません。この場合、国ごとのエントリ数は取得できますが、オブジェクトの数は取得できません。
今回は各国の各オブジェクトのエントリ数を取得するため、country_iso と object_id でグループ化することはできません。

そのため、オブジェクトごとに最後のエントリを取得し、国ごとにグループ化して数量を取得する必要があるようです。また、最後のエントリの country_iso が null に等しい場合も回避する必要があります。そのため、オブジェクトの最後のエントリが null の場合、最後のエントリよりも前にエントリを取得する必要があります (したがって、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

アイデアをお寄せいただきありがとうございます。
PS: 大量のデータ (100 000 を超えるオブジェクトと、それぞれに 10 を超えるエントリ) があり、リモート サーバー上にあることに注意してください。そのため、データを取得できず、メインサーバーで ruby​​ を使用して何らかの方法でデータを再計算します。

4

3 に答える 3

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 }'
)
于 2012-05-18T03:07:30.233 に答える
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 つのクエリです。クエリごとに 1 ミリ秒という恐ろしいことではないかもしれません。

于 2012-05-18T03:15:00.013 に答える
0
MyCollection.where(country_iso: "US").count
于 2012-05-17T20:06:35.057 に答える