我正在使用MongoDB开发一个web应用程序,我对模式设计有一些问题。
我想做的是使用Mongo存储每个用户的能耗数据。对于每个用户,我们都会有电力消耗的数据,这是一个时间戳和消耗。
所以问题是如何将它们存储在Mongo中,我有两种方法
-
将所有内容放在一个集合中。所以它会有这样的:
{"user_id": "e211a233-808f-fc43-0800-c05650001785","Value": 274,"Time": 1314691200}
因此,每个用户可能有成千上万的数据,而我们有成千上万的用户。因此,一个收藏中将有数千万份文件。
-
将一个用户的数据放入一个集合中。因此,我们将有成千上万的收藏品,每个收藏品中都有成千上万的文件。
考虑到性能,有人能帮我哪种方法更好吗?
对于这个问题的任何新引用:
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将是您在这里进行分析的朋友。