Мне нужно что-то немного более сложное, чем примеры в документах MongoDB, и я, может казаться, не могу перенести голову вокруг этого.
Скажите, что у меня есть набор объектов формы {date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...}
Теперь я хочу получить что-то подобное запросу GROUP BY SQL, группирующемуся и по дате и по типу. Таким образом, я хочу количество событий каждого типа в каждый день. Кроме того, я хотел бы сделать это уникальным user_id, т.е. если у пользователя есть больше событий в тот же день, считайте его только однажды.
Я пытаюсь сделать, это с отображает/уменьшает.
Я делаю
db.logs.mapReduce(
function() {
emit(this.type, 1);
},
function(k, vals) {
var total = 0;
for (var i = 0; i < vals.length; i++)
total += vals[i];
return total;
}
)
который приятно группы типом, но теперь, как я могу сгруппироваться по дате одновременно? Кажется, что ключ испускает (), не может быть массив (я думал о выполнении emit([this.date, this.type], 1)
). Кроме того, как я могу гарантировать уникальность в расчете на пользователя?
Я только запускаю с MongoDB, и я все еще испытываю затруднения при схватывании фундаментальных понятий. Кроме того, нет большого количества документации, доступной там. Любая справка от более опытных пользователей ценится.Спасибо!
Нашел очень хорошее решение в Поваренной книге MongoDB (раньше не знал об этом ресурсе).
http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
По сути, для группировки по нескольким ключам вы используете dict, а не список (как я пытался). Также, чтобы получить уникальные результаты, вам нужно сделать два прохода map / reduce.