代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

如何使用MongoDB Ruby驱动程序执行“group”(group by)?

  •  4
  • nonopolarity  · 技术社区  · 14 年前

    有关 MongoDB Group using Ruby driver

    如果我想在SQL中执行如下操作:

    select page_id, count(page_id) from a_table group by page_id
    

    我以为MongoDB的医生说

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

    group(key, condition, initial, reduce, finalize = nil)
    # returns an array
    

    Analytic.collection.group(  "fucntion (x) return {page_id : x.page_id}", 
                                nil, 
                                {:count => 0},  
                                "function(x, y) { y.count++ }"  )
    

    [{"count"=>47.0}] 
    

    http://kylebanker.com/blog/2009/11/mongodb-count-group/

    db.pageviews.group(
    {
     key: {'user.agent': true}, 
     initial: {sum: 0}, 
     reduce: function(doc, prev) { prev.sum += 1}
    });
    

    Analytic.collection.group(  ['page_id'], nil, 
      {:count => 0},  "function(x, y) { y.count++ }"  )
    

    2 回复  |  直到 14 年前
        1
  •  4
  •   Pan Thomakos    14 年前

    第一个示例不起作用的原因是您将“function”拼写为“function”。以下内容应该有效:

    Analytic.collection.group( "function(x){ return {page_id : x.page_id}; }", 
                               nil, 
                               { :count => 0 },  
                               "function(x, y){ y.count++; }" )
    
        2
  •  2
  •   nonopolarity    14 年前

    我终于让它工作了

    Analytic.collection.group(  ['myapp_id'], {:page => 'products'}, 
      {:pageviews => 0, :timeOnPage => 0},  
      "function(x, y) { y.pageviews += x.pageviews;  y.timeOnPage += x.timeOnPage }"  )
    

    但后来我使用了map/reduce,因为map/reduce似乎是一种更通用、更强大的方法。