2

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

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

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

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

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

    所以,每个用户可能有成千上万的数据,而我们有成千上万的用户。因此,一个集合中将有数千万个文档。

  2. 将一个用户的数据放在一个集合中。所以我们将有数千个集合和每个集合中的数千个文档。

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

4

3 回答 3

2

对于这个问题的任何新指:

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

第1部分

第2部分

第 3 部分

于 2014-11-08T10:07:47.150 回答
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 本质上将嵌入的数组字段转换为类似列的数据,然后可以对这些数据进行分组、求和、计数等。

于 2012-11-21T14:21:36.107 回答
1

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

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

[更新]

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

于 2012-11-21T12:47:19.900 回答