Подтвердить что ты не робот

Использование карты MongoDB/сокращение до "группировать по" двумя полями

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

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

Теперь я хочу получить что-то похожее на запрос SQL GROUP BY, группируя его как по дате, так и по типу. То есть, я хочу количество событий каждого типа в каждый день. Кроме того, я хотел бы сделать его уникальным по user_id, т.е. если у пользователя больше событий в тот же день, считайте его только один раз.

Я пытаюсь сделать это с помощью map/reduce.

Я делаю

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

4b9b3361

Ответ 1

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

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

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