Используя только инструменты в MongoDB, лучший вариант был бы разделить события во время ведер, и использовать aggregation framework сделать анализ на этих ковшиках.
Первым шагом является реструктуризация вашей схемы. Лучше поместить каждое событие в свой собственный документ, чтобы обеспечить более гибкий запрос и предотвратить необходимость увеличения документов при добавлении новых событий. См. Документацию по адресу Normalized Data Models.
Например, у вас могут быть две коллекции: users
и events
, где events.user
относится к владению user
.
{
_id: ObjectId,
name: string
}
{
_id: ObjectId,
user: ObjectId,
date: Date,
date_ms: Integer
}
Вы можете использовать следующий запрос, чтобы найти один-минутные интервалы, содержащие более 100 событий:
db.events.aggregate([
{$group: {_id: {$subtract: ["$date_ms", { $mod: ["$date_ms", 60*1000]} ]},
count: { $sum: 1 }}},
{$match: {"count": {$gt: 100}}}
])
Имейте в виду, что этот запрос не является идеальным решением: он не возвращает кластер событий, которые разбиваются по границе ведра. Для более сложной логики вам придется выполнять анализ в своем приложении.
С MongoDB? srsly? Получите данные, проанализируйте их снаружи, верните результаты. –