Перезапись существующих значений в поле уникального индекса в MongoDB (объединение событий пульса)

У меня есть веб-страница, отправляющая события сердцебиения на серверную часть nodejs, чтобы отслеживать, как долго пользователи просматривают определенную страницу (или части страницы). События сохраняются в MongoDB пакетами с использованием метода insertMany от Mongoose:

Event.insertMany(events)

Здесь events — это массив, содержащий несколько событий. Одиночное мероприятие устроено следующим образом:

{user_page_id: 1234, time_spent: 30, ...}

Поскольку я отслеживаю время, проведенное на странице, имеет значение только самое последнее значение time_spent на user_page_id, и я не хочу заполнять MongoDB ненужными данными. Я попытался справиться с этим, определив user_page_id как уникальный индекс:

user_page_id: {type: Number, index: {unique: true, sparse: true}}

Теперь пара вопросов:

  • Можно ли сделать user_site_id уникальным, чтобы существующие значения всегда заменялись новыми значениями? (Кажется, что функциональность по умолчанию просто отклоняет дубликаты. Что-то обсуждалось здесь, но не помогло .)

  • Можно ли сделать user_site_id уникальным, чтобы разрешались повторяющиеся значения null? (Есть и другие события, где эти данные равны null. Опция sparse, по-видимому, имеет дело только с отсутствующими значениями)

  • Возможно ли решить эту проблему с помощью уникального индекса или мне следует найти другой подход?

Другие возможные решения, о которых я мог подумать, следующие:

  • Индивидуальная обработка пульсаций с помощью собственного обработчика с помощью upsert. (Возможно, но добавляет некоторую ненужную (?) сложность в конвейер обработки. Также предпочтительнее использовать пакетный режим.)
  • Сохранение пульсаций в памяти и сохранение их в БД после некоторого тайм-аута. (Проблема в том, что таймеры сердцебиения должны иметь возможность приостанавливаться. Также я хотел бы, чтобы сервер не сохранял состояние.)
  • Переворачивание всего с ног на голову с помощью веб-сокетов. (Возможно, но добавляет некоторую ненужную (?) сложность, поскольку иногда отслеживание связано с частями страницы, и на одной странице может быть несколько одновременных таймеров пульса.
  • Сохраняйте все события как есть и очищайте ненужные события позже с помощью некоторого задания пакетной обработки. (Не совсем уверен, но может вызвать некоторые проблемы с производительностью в MongoDB). Кроме того, здесь используется ограниченная коллекция, но на самом деле это не решает проблему.

Итак, вкратце, самый важный вопрос заключается в том, как эффективно и элегантно справиться с агрегированием такого рода данных сердцебиения?


person pipo    schedule 26.09.2016    source источник
comment
Представляет ли интерес только одно событие на пользователя (последнее) или вы имели в виду несколько последних событий, а остальные бесполезны?   -  person Amin J    schedule 27.09.2016
comment
Самое последнее, так как нет значения для сохранения события, которое сообщает, что пользователь был на странице 60 секунд, если мы уже сохранили следующее событие, которое сообщает, что пользователь был там в течение 90 секунд.   -  person pipo    schedule 27.09.2016