Я пытаюсь вернуть список комбинаций год / месяц с подсчетами для описания сообщений в блоге. Идея в том, что они будут отображаться так:
- январь 2010 (1 сообщение)
- декабрь 2009 (2 сообщения)
- ...
Мне удалось заставить это работать, используя оболочку MongoDB JS, и она возвращает результаты в полезном формате:
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
}
Кажется, либо он полностью игнорирует свою собственную документацию (и мое понимание исходного кода!), Либо я упускаю что-то фундаментальное. Я почти выдергиваю волосы, любая помощь с благодарностью принята.