2015-02-01 1 views
1

С учетом пользовательской схемы, содержащей журнал событий, как вы определяете кластеры временных событий; например, n или более событий в пределах м секунд? Каждый пользователь может выглядеть, и я заинтересован во всех пользователях:Временная кластеризация в mongodb

{ 
_id: ... 
name: ... 
events: [{foo: bar, date: Date}, ...] 
} 
+0

С MongoDB? srsly? Получите данные, проанализируйте их снаружи, верните результаты. –

ответ

0

Используя только инструменты в 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}}} 
]) 

Имейте в виду, что этот запрос не является идеальным решением: он не возвращает кластер событий, которые разбиваются по границе ведра. Для более сложной логики вам придется выполнять анализ в своем приложении.

Смежные вопросы