Mongo Schema设计时间序列数据



我正在使用MongoDB开发一个web应用程序,我对模式设计有一些问题。

我想做的是使用Mongo存储每个用户的能耗数据。对于每个用户,我们都会有电力消耗的数据,这是一个时间戳和消耗。

所以问题是如何将它们存储在Mongo中,我有两种方法

  1. 将所有内容放在一个集合中。所以它会有这样的:

    {"user_id": "e211a233-808f-fc43-0800-c05650001785","Value": 274,"Time": 1314691200}

    因此,每个用户可能有成千上万的数据,而我们有成千上万的用户。因此,一个收藏中将有数千万份文件。

  2. 将一个用户的数据放入一个集合中。因此,我们将有成千上万的收藏品,每个收藏品中都有成千上万的文件。

考虑到性能,有人能帮我哪种方法更好吗?

对于这个问题的任何新引用:

mongoDB有一些关于这个特定问题的非常有用的视频教程。请参阅以下链接,它肯定会对您有所帮助:

第1部分

第2部分

第3部分

您可以使用选项1,也可以在多个节点之间共享数据以提高性能。

或者,如果这是一种选择,我会亲自为每个用户保留一个每日条目,然后使用

db.coll.update( 
{ _id : userId, date: '12/11/2012' }, 
{ $inc : {  consumption : value } },
true // insert the document if it does not exist and init consumption with 0
)

如果你不会经常查询数据,你也可以在一天的集合中添加一个每日文档中的条目,如下所示:

db.days.update( { day: '12/11/2012' } , 
{ $addToSet : 
{ todaysConsumptions : { userId : id, consumption: value, time: timestamp } 
} 
}

从最后一个方法查询数据的方法是使用聚合框架,并在todaysCumptions字段上执行$unroll操作$展开基本上将嵌入的数组字段转换为列状数据,然后可以对其进行分组、求和、计数等。

选项1将充分利用您的索引并很好地扩展。它将比总是在变化的大量文档更容易高效地查询和更新。如果您计划在将来聚合这些数据,这也会使您的查询更加容易。具体来说,在文档上使用聚合框架比必须首先展开的文档中的数组效率高得多。

此外,如果你计划拥有15万个这样的条目,那么它将超过16MB的单个文档限制,所以我认为根据选项1,在一个大集合中拥有单个文档几乎总是更好的。

[更新]

再看一遍,我发现你没有提到你会对数据进行什么查询。这是关键。但考虑到你的结果似乎是历史性的,它越来越倾向于将数据放入数百万个文档中。Map Reduce将是您在这里进行分析的朋友。

最新更新