4

Rubyドライバーを使用したMongoDBグループに関連

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}
});

しかし、それは他のstackoverflowポストにはありません。

更新:実際には、上記のリンクで、次のようなソリューション

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

は機能しますが、なぜこの投稿の最初の方法が機能しなかったのか疑問に思います。

4

2 に答える 2

4

最初の例が機能しなかった理由は、「関数」のつづりを「関数」と間違えたためです。以下が機能するはずです。

Analytic.collection.group( "function(x){ return {page_id : x.page_id}; }", 
                           nil, 
                           { :count => 0 },  
                           "function(x, y){ y.count++; }" )
于 2010-09-16T17:44:26.400 に答える
2

私はついにそれを動作させるようになりました

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を使用しました。

于 2010-09-25T06:14:58.003 に答える