mongodb 中的时间聚类

Temporal clustering in mongodb

给定包含事件日志的用户模式,您将如何识别时间事件集群;例如,nm 秒内的更多事件?每个用户可能是这样的,我对所有用户感兴趣:

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

仅使用 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}}}
])

请注意,此查询不是完美的解决方案:它不会 return 跨桶边界拆分的事件集群。对于更复杂的逻辑,您将不得不在您的应用程序中进行分析。