Использование карты / редукции MongoDB для "группировки по" двум полям - PullRequest
20 голосов
/ 12 мая 2010

Мне нужно что-то более сложное, чем примеры из документации MongoDB, и я не могу обернуться вокруг этого.

Скажем, у меня есть коллекция объектов вида {date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...}

Теперь я хочу получить что-то похожее на запрос SQL GROUP BY с группировкой по дате и типу. То есть я хочу количество событий каждого типа в каждый день. Также я бы хотел сделать его уникальным по 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 () не может быть массивом (я думал о выполнении emit([this.date, this.type], 1)). Кроме того, как я могу гарантировать уникальность для каждого пользователя?

Я только начинаю с MongoDB, и мне все еще трудно понять основные понятия. Кроме того, там не так много документации. Любая помощь от более опытных пользователей приветствуется. Спасибо!

1 Ответ

19 голосов
/ 12 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...