Mongo Schema Design时间序列数据

时间:2012-11-21 06:35:20

标签: mongodb

我正在使用MongoDB开发Web应用程序,我对架构设计有一些疑问。

我想要做的是为每个用户使用Mongo商店能耗数据。对于每个用户,我们将获得用电量数据,这是时间戳和消耗量。

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

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

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

    因此,每个用户可能拥有数千个数据,而且我们拥有数千个用户。因此,一个集合中将有数千万个文档。

  2. 将一个用户的数据放在一个Collection中。因此,我们将在每个集合中拥有数千个集合和数千个文档。

  3. 任何人都可以帮助我考虑性能哪种方法更好?

3 个答案:

答案 0 :(得分:2)

对于此问题的任何新引用:

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

part 1

part 2

part 3

答案 1 :(得分:1)

选项1将利用您的索引并向外扩展。与总是在变化的大型文档相比,查询和更新更容易。如果您计划将来聚合该数据,它还将使您的查询更容易。具体来说,在文档中使用聚合框架比在必须首先展开的文档中的数组更有效。

另外,如果您计划在150K这样的区域内进行,那么它将超过16MB的单个文档限制,因此我认为根据选项1,大型集合中的单个文档几乎总是更好。

<强> [更新]

再看一遍,我看到你没有提到你会对数据进行哪些查询。这是关键。但鉴于您的结果看起来好像是历史的,它看起来越来越像将数据放入数百万个文档中。 Map-Reduce将成为您的朋友进行分析。

答案 2 :(得分:1)

您可以使用选项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 } 
  } 
}

从最后一种方法查询数据的方法是在todaysConsumptions字段上使用带有$ unwind操作的聚合框架。 $ unwind实质上将嵌入的数组字段转换为类似数据的列,然后可以对其进行分组,求和,计数等。