MongoDB 查询或编程解决方案

Posted

技术标签:

【中文标题】MongoDB 查询或编程解决方案【英文标题】:MongoDB query or programmatic solution 【发布时间】:2014-01-16 22:59:47 【问题描述】:

我对大数据还很陌生,我们有数百万条记录,这些记录的数据方式如下 -

ID    Timestamp    Status
1.      12:00:00.      ON
1.       12:00:35.      Off
1.       12:01:01.      ON
1.        12:10:00.     Off
1.        12:11:00.      On

我需要计算它关闭的总时间。这涉及数百万条记录,因此解决方案必须快速。关于我可以通过算法或通过查询做什么的任何想法?我认为一种方法是通过数组迭代数据,但这似乎太耗时了,我相信人们之前已经这样做了。

【问题讨论】:

数据格式是什么?你说遍历数组——数组是什么?您可以包含数据库中的实际文档吗?是否也保证事件是有序且独特的? IE。你不能一次又一次地关闭,或者你可以? 1.数据格式是json,因为它存储在mongodb中。 1.当我指的是数组时,我想说的是我可以编写一个查询,该查询返回并将该数据插入使用 java 的数组中。我将不得不设置一个测试文档,我可以在家里做。我只放了相关文件,但我可以保证它们是独一无二的。是的,由于其他列已更新,您可以一次又一次地关闭。 您需要包含一个示例文档,因为您没有非常清楚地描述其结构。 基本上我试图在 mongodb 中找到类似 LAG 或 LEAD 函数的东西。有没有办法做到这一点?就像在 mongodb 中查找上一行或下一行一样? 【参考方案1】:

您可以进行两种聚合,一种获取 OFF 时间戳的总和,另一种获取 ON 时间戳的总和(将所有内容标准化为自某个固定日期以来的秒数,但如果可能,请选择最近的内容以避免溢出计算将使用 double 类型,因此您有一些喘息的空间)。然后从 OFF 时间戳中减去 ON 时间戳的总和。只要它们都配对正确(每个 ON 对应一个 OFF),这就是正确的答案。

那是因为你可以重写总和

'b's 是 OFF 事件,'a's 是 ON 事件。

要使用聚合框架执行此操作,假设您的文档格式为 _id: <id>, timestamp: <ts>, status: <'ON'|'OFF'>

db.coll.aggregate($group: _id: '$status', total: $sum: '$timestamp')

【讨论】:

当 'on' 和 'off' 状态没有配对时,这在概念上不起作用 - 'off' 似乎可以跟随 'off' (根据澄清评论)。此外,sum 只允许用于数字,因此如果时间戳存储为除数字以外的任何内容,您的“总数”将为 0。

以上是关于MongoDB 查询或编程解决方案的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 巨大的文档或多个查询

Go + MongoDB:多态查询

MongoDB $或查询

资源 | PHP之 MongoDB 从配置到编程视频

MongoDB查询中的问题

MongoDB:运行更快的查询,这更好 Pymongo 或 MongoEngine