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