Mongodb Mongo模式设计时间序列数据

Mongodb Mongo模式设计时间序列数据,mongodb,Mongodb,我正在使用MongoDB开发一个web应用程序,我对模式设计有一些疑问 我想做的是使用Mongo存储每个用户的能耗数据。对于每个用户,我们都会有电力消耗的数据,这是一个时间戳和消耗 所以问题是如何在Mongo中存储它们,我有两种方法 把所有的东西都放在一个集合里。所以它会像这样: {“用户id”:“e211a233-808f-fc43-0800-c05650001785”,“值”:274,“时间”:1314691200} 因此,每个用户可能有数千个数据,而我们有数千个用户。因此,在一个集合中会有

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

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

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

  • 把所有的东西都放在一个集合里。所以它会像这样:

    {“用户id”:“e211a233-808f-fc43-0800-c05650001785”,“值”:274,“时间”:1314691200}

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

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


  • 有谁能帮助我,哪种方法在性能方面更好?

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

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

    [更新]


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

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

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

    [更新]


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

    您可以使用选项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操作$“展开”实质上是将嵌入式数组字段转换为类似列的数据,然后可以对这些数据进行分组、求和、计数等。

    您可以使用选项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操作$“展开”实质上是将嵌入式数组字段转换为类似列的数据,然后可以对这些数据进行分组、求和、计数等。

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

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


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

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


    安排基准测试似乎没什么大不了的。这将是你的测试,在你的环境中。顺便问一下,为什么不是3。将一个用户的数据放在一个文档中?我还没有考虑过一个文档。我现在没有所有的数据,所以我无法进行测试。将一个用户的所有数据(嵌入)到一个文档中会使获取特定用户的详细信息非常有效。但是,如果每个用户的消费记录数量很大,如果您计划在需要时对该集合进行切分,选项1将使之更容易。您需要对数据执行哪些查询?它只是获取特定用户的历史数据吗?很抱歉这么晚才回复。是的,我想获取一个特定用户的数据。安排基准测试似乎没什么大不了的。这将是你的测试,在你的环境中。顺便问一下,为什么不是3。将一个用户的数据放在一个文档中?我还没有考虑过一个文档。我现在没有所有的数据,所以我无法进行测试。将一个用户的所有数据(嵌入)到一个文档中会使获取特定用户的详细信息非常有效。但是,如果每个用户的消费记录数量很大,如果您计划在需要时对该集合进行切分,选项1将使之更容易。您需要对数据执行哪些查询?它只是获取特定用户的历史数据吗?很抱歉这么晚才回复。是的,我想去拿d