Используя MongoDB отображают/уменьшают для “группировки” двумя полями

Мне нужно что-то немного более сложное, чем примеры в документах 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, и я все еще испытываю затруднения при схватывании фундаментальных понятий. Кроме того, нет большого количества документации, доступной там. Любая справка от более опытных пользователей ценится.Спасибо!

20
задан Assaf Lavie 4 June 2012 в 12:08
поделиться

1 ответ

Нашел очень хорошее решение в Поваренной книге MongoDB (раньше не знал об этом ресурсе).

http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

По сути, для группировки по нескольким ключам вы используете dict, а не список (как я пытался). Также, чтобы получить уникальные результаты, вам нужно сделать два прохода map / reduce.

19
ответ дан 30 November 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: