mongodb 中的时间聚类
Temporal clustering in mongodb
给定包含事件日志的用户模式,您将如何识别时间事件集群;例如,n 或 m 秒内的更多事件?每个用户可能是这样的,我对所有用户感兴趣:
{
_id: ...
name: ...
events: [{foo: bar, date: Date}, ...]
}
仅使用 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}}}
])
请注意,此查询不是完美的解决方案:它不会 return 跨桶边界拆分的事件集群。对于更复杂的逻辑,您将不得不在您的应用程序中进行分析。
给定包含事件日志的用户模式,您将如何识别时间事件集群;例如,n 或 m 秒内的更多事件?每个用户可能是这样的,我对所有用户感兴趣:
{
_id: ...
name: ...
events: [{foo: bar, date: Date}, ...]
}
仅使用 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}}}
])
请注意,此查询不是完美的解决方案:它不会 return 跨桶边界拆分的事件集群。对于更复杂的逻辑,您将不得不在您的应用程序中进行分析。