4

ブログ投稿を説明するためのカウントを含む年/月の組み合わせのリストを取り戻そうとしています。アイデアは、それらが次のように表示されるということです。

  • 2010年1月(1投稿)
  • 2009年12月(2件の投稿)
  • ..。

私はこれをMongoDBJSシェルを使用して機能させることができ、有用な形式で結果を返します。

db.posts.group({ 
    keyf: function(x){ 
                      return { 
                              month: x.datetime.getMonth(), 
                              year:x.datetime.getFullYear() 
                      }; 
    }, 
    reduce: function(x,y){ y.count++ }, 
    initial:{count:0} 
})

結果:

[ { "month" : 0, "year" : 2010, "count" : 3 },
  { "month" : 0, "year" : 1970, "count" : 1 } ]

これは素晴らしいです、まさに私が求めているものです。しかし、これをrubyドライバーに適したコードに変換しようとすると、動作させることができません。私はドキュメントを見て、私の理解から、以下は同じ結果をもたらすはずです(私はMongoMapperを使用しているので、Post.collection):

@archive = Post.collection.group(
  "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }",
  nil, { :count => 0 }, 'function(x,y){y.count++}', true)

有用なデータの素晴らしい配列を返す代わりに、私はこの混乱を得ています:

{
  "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }" => nil, 
  "count" => 4.0
}

それはそれ自身のドキュメンテーション(そしてソースコードの私の理解!)に完全に反しているようであるか、私はここで基本的な何かを見逃しているようです。私はほとんど髪を抜いています、どんな助けでもありがたいことに受け入れられました。

4

1 に答える 1

2

それはかなり奇妙な振る舞いです。コードをローカルで実行したところ、すべてが機能しました。ドライバーバージョン0.18.2を使用していることを確認できますか?その場合は、それがインストールされている唯一のバージョンであることを確認してください(健全性チェックと同じように)。

違いはないと思いますが、MongoMapperから#groupを実行していませんでした。gemを単独で使用していました。あなたもそれを試すかもしれません。これが私が実行したコードです:

require 'rubygems'
require 'mongo'

d = Mongo::Connection.new.db('blog')
c = d['post']

p c.group("function(x) { return { month: x.date.getMonth(), year:x.date.getFullYear() }; }", 
  nil, 
  { :count => 0 }, 
  "function(x,y){y.count++}", 
  true)
于 2010-01-24T15:58:44.960 に答える