Для вашего запроса можно использовать MongoDB group
метод , сравнимый с оператором SQL group by
.
Я не проверял это, но ваш запрос мог выглядеть примерно так:
var results = db.coll.group({
key: { user_id: true },
cond: { $or: [ { action1: "phone-call" }, { action2: "computer-check" } ] },
initial: { actionFlags: 0 },
reduce: function(obj, prev) {
if(obj.action1 == "phone-call") { prev.actionFlags |= 1; }
if(obj.action2 == "computer-check") { prev.actionFlags |= 2; }
},
finalize: function(doc) {
if(doc.actionFlags == 3) { return doc; }
return null;
}
});
Опять же, я не проверял это, это основано на моем чтении документации. Вы группируете по user_id
(декларация key
). Строки, которые вы хотите пропустить, имеют либо action1 == "phone-call"
, либо action2 == "computer-check"
(объявление cond
). Начальное состояние, когда вы начинаете проверку определенного user_id
, равно 0 (initial
). Для каждой строки вы проверяете, если action1 == "phone-call"
и устанавливаете его флаг, и проверяете action2 == "computer-check"
и устанавливаете его флаг (функция reduce
). После того, как вы отметили типы строк, убедитесь, что установлены оба флага. Если это так, сохраните объект, в противном случае удалите его (функция finalize
).
Эта последняя часть - единственная, в которой я не уверен, поскольку в документации явно не указано, что вы можете выбивать записи в функции finalize
. Возможно, мне понадобится больше времени, чтобы настроить некоторые тестовые данные, чтобы увидеть, работает ли приведенный выше пример.