我正在尝试将带有描述博客帖子的计数的年/月组合列表带回来。我们的想法是这样显示:
我已经设法使用MongoDB JS shell使其工作,并以有用的格式返回结果:
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
}
它似乎完全违背了自己的文档(以及我对源代码的理解!)或者我在这里缺少一些基本的东西。我差点把头发拉出来,任何帮助都会感激不尽。
答案 0 :(得分: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)