给定一个包含事件日志的用户架构,您如何识别时间事件集群;例如,在m秒内有n个或更多事件?每个用户可能看起来像这样,我对所有用户都感兴趣:
{
_id: ...
name: ...
events: [{foo: bar, date: Date}, ...]
}
仅使用MongoDB中的工具,最好的选择是将事件分为时间段,并使用聚合框架对这些时间段进行分析。
第一步是重组架构。最好将每个事件放在自己的文档中,以允许更灵活的查询并防止添加新事件时文档的需求增长。请参阅有关规范化数据模型的文档。
例如,您可能有两个集合: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}}}
])
请注意,此查询不是完美的解决方案:它不会返回跨越存储桶边界划分的事件集群。对于更复杂的逻辑,您将必须在应用程序中进行分析。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句