如果用户架构包含事件日志,您将如何识别时态事件集群;例如, n 或 m 秒内的更多事件?每个用户可能看起来像这样,我对所有用户感兴趣:
{
_id: ...
name: ...
events: [{foo: bar, date: Date}, ...]
}
答案 0 :(得分: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}}}
])
请注意,此查询不是一个完美的解决方案:它不会返回跨存储区边界拆分的事件集群。对于更复杂的逻辑,您必须在应用程序中进行分析。