我正在尝试将mongodb用于时间序列数据库,并且想知道是否有人可以建议如何针对该场景进行最佳设置。
时间序列数据与股票价格历史记录非常相似。我收集了来自不同机器的各种传感器的数据。有十亿个时间戳的值,我想问以下问题(最好是从数据库而不是应用程序级别):
对于给定的一组传感器和时间间隔,我希望按时间顺序位于该间隔内的所有时间戳和传感器值。假设所有传感器共享相同的时间戳(它们都是在同一时间采样的)。
对于给定的一组传感器和时间间隔,我希望按时间顺序在给定间隔内的每个第k个项目(时间戳和相应的传感器值)。
关于如何最好地进行设置并实现查询的任何建议?
感谢您的建议。
如果您不需要永远保存数据(即您不介意数据“老化”),则可以考虑使用“上限收集”。上限集合具有许多限制,这些限制反过来又提供了一些有趣的好处,听起来似乎它们非常符合您的需求。
基本上,一个有上限的集合具有指定的大小,并且按照插入顺序将文档写入其中,直到其填满为止,此时它会环绕起来并开始用最新的文档覆盖旧的文档。您对可以在上限集合中的文档上执行的更新有一点限制-即。您将无法执行会更改文档大小的更新(因为这意味着需要将其移动到磁盘上才能找到多余的空间)。我看不出这是您所描述的问题。
这样做的结果是,您可以确保将上限集合中的数据按插入顺序写入磁盘并保留在磁盘上,这将使对插入顺序的查询变得非常快。
顺便说一句,传感器及其产生的数据有何不同?如果它们相对相似,我建议将它们全部存储在同一集合中以便于使用-否则将它们分开。
假设您使用单个集合,那么两个查询听起来都非常可行。要记住的一件事是,要获得有上限的集合的好处,您将需要根据集合的“自然”顺序进行查询,因此,按时间戳记键进行查询的速度不会那么快。如果以固定的时间间隔进行读数(因此您知道在给定的时间间隔内将读取多少个读数),那么我将为查询1建议类似以下内容:
db.myCollection.find().limit(100000).sort({ $natural : -1 })
例如,假设您每秒存储100个读数,则上面的内容将返回最后100秒的数据。如果您需要前100秒,则可以添加.skip(100000)。
对于第二个查询,在我看来,您需要MapReduce,但这听起来并不困难。您可以通过与上述查询类似的查询来选择所需文档的范围,然后使用该map功能按您感兴趣的时间间隔仅选择那些文档。
这是有关上限集合的Mongo文档:http : //www.mongodb.org/display/DOCS/Capped+Collections
希望这可以帮助!