mongodb中的时间聚类

时间:2015-02-01 23:12:30

标签: mongodb cluster-analysis aggregation-framework

如果用户架构包含事件日志,您将如何识别时态事件集群;例如, n m 秒内的更多事件?每个用户可能看起来像这样,我对所有用户感兴趣:

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

1 个答案:

答案 0 :(得分:0)

仅使用MongoDB中的工具,您最好的选择是将事件拆分为时间段,并使用aggregation framework对这些存储桶进行分析。

第一步是重构架构。最好将每个事件放在自己的文档中,以允许更灵活的查询,并防止在添加新事件时增加文档的需求。请参阅Normalized Data Models上的文档。

例如,您可能有两个集合:usersevents,其中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}}}
])

请注意,此查询不是一个完美的解决方案:它不会返回跨存储区边界拆分的事件集群。对于更复杂的逻辑,您必须在应用程序中进行分析。