【问题标题】:Grouping query for mongo and railsmongo 和 rails 的分组查询
【发布时间】:2012-05-17 16:52:29
【问题描述】:

我有一个具有以下结构的跟踪表
id | country_iso | object_id | created_at
每个对象可以有一个或多个国家的多个条目。我需要弄清楚每个国家/地区现在有多少物品。
我不能只按 country_iso 对其进行分组,因为在这种情况下,我将获得每个国家/地区的条目数,而不是对象数。
我不能按 country_iso 和 object_id 对其进行分组,因为此时我将获得每个国家/地区每个对象的条目数。

所以,似乎我必须获取每个对象的最后一个条目,然后按国家/地区对它们进行分组并获取数量。我还需要避免最后一个条目的 country_iso 等于 null 的情况。因此,如果 object 的最后一个条目为 null,我们必须在 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.:请注意,有很多数据(超过 100 000 个对象,每个对象超过 10 个条目)并且位于远程服务器上。因此,我无法获取数据并以某种方式在主服务器上使用 ruby​​ 重新计算它们。

【问题讨论】:

  • 100,000?如果您需要经常这样做,您也许可以在 Ruby 中做到这一点......!
  • 我必须做一次(至少它被请求为一次数据拉取)

标签: ruby-on-rails mongodb mongomapper database


【解决方案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 }'
)

【讨论】:

    【解决方案2】:
    MyCollection.where(country_iso: "US").count
    

    【讨论】:

      【解决方案3】:

      一个不太聪明的方法是滥用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 毫秒可能并不可怕。

      【讨论】:

      • 有趣的想法,谢谢。但似乎不是很好,因为在这种情况下,某些对象可能会出现在每个国家/地区的选择中。对于我的示例,它将是 US => 2, null => 1, UK => 3
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多