【问题标题】:Correct way to store large collection of Mongo data in time series so it can easily be queried?以时间序列存储大量 Mongo 数据以便轻松查询的正确方法?
【发布时间】:2019-11-14 01:36:29
【问题描述】:

如果我们将大量数据(比如几百 MB)保存到 Mongo 集合中以获得一天的数据,将其放入新数据库以跨时间保存数据的最佳方法是什么(以及因此可以查询它以查看随时间的变化)?我一直在将数据保存到类似于以下结构的集合中。价格每天都在变化,到目前为止,我每天都在用新数据替换旧数据。相反,我希望能够保留现有的结构,但将每天的收集与旧数据一起保存到一个新的数据库中,让我可以跨时间进行查询。在新数据库中构建它的最佳方法是什么,以便我可以轻松地跨时间查询单位定价数据,但不必更改当前数据库的保存方式? 我应该将每一天的数据作为新数据库中的一个单独集合并按日期命名每个集合,还是将每一天的数据放在它自己的文档中的一个非常大的集合中,还是其他什么?

当前结构(代表给定日期的价格快照):

Collection: 
[{name: 'Property A',
latlng: [1,2],
propertyData: [{blah, blah}],
units: [
    {unitNum: 1, 
    pricingData: {
        1/1/2020: 
            {3-month-lease: 1500,
            4-month-lease: 1400, 
        ... [more prices for different lease lengths]
        1/2/2020: [prices for different lease lengths],
        ... //lots of data for prices on each date
        3/31/2020: [somedata]} }
    {unitNum: 2, pricingData: [pricing data for unit 2]
    ... [more data on units for this property]
    ]
},
{name: 'Property B',
latlng: [1,2],
propertyData: [{blah, blah}],
units: [
    {unitNum: 1, 
    pricingData: {
        1/1/2020: 
            {3-month-lease: 1500,
            4-month-lease: 1400, 
        ... [more prices for different lease lengths]
        1/2/2020: [prices for different lease lengths],
        ... //lots of data for prices on each date
        3/31/2020: [somedata]} }
    {unitNum: 2, pricingData: [pricing data for unit 2]
    ... [more data on units for this property]
    ]
}
... //data for many other properties
]

同样,上面代表 1 天数据的快照。我想要一个数据库,其中包含每天的数据以及上述数据,以便我可以看到单位的定价数据如何随时间变化。

感谢您的帮助!

【问题讨论】:

  • 如果有帮助,每天的数据将包含大约 300mb 的数据(数千个单位的数据和每个单位的大量定价数据)。迄今为止,这 300mb 的每日数据都在一个集合中(同样,我想以某种方式将每天的数据保存在一起)

标签: mongodb mongoose mongodb-query


【解决方案1】:

创建一个新集合可能不是一件好事。对于 MongoDB,每个集合和索引本身就是文件。其中太多会导致文件处理和内存问题。

改为使用日期/时间值来区分日期以及搜索和排序所需的任何其他字段。

【讨论】:

  • 感谢@Steve,所以 1 个包含许多日期文档的集合?这应该没问题,即使集合中的每个日期文档都有一堆嵌套值并且大约为 300mb?所以集合会是这样的:[ {date1: {300mb of data}, date2: {300mb of data}, date3: {300mb of data}...}]
  • 单个文档中的数据不能超过 16 MB。因此,文档中包含 300 MB 的数据已经过时了。另外,如果您考虑在文档中有一个 BLOB,那么我建议如果可以的话,将数据实际添加为文档中的字段。如果数据是真正的二进制,那么您可能想要使用 MongoDB 的 GridFS 功能。在 MongoDB 中存储对二进制数据的引用可能会更好,但作为对象的实际 BLOB 是一个对象存储系统,如 S3。
  • 许多文档可以共享一个日期。您可能还有其他标识字段,如批号或客户编号,可用于查找特定批次的数据。
  • 嗨@Steve,谢谢,不胜感激;我已经编辑了原始问题中的代码部分,以阐明数据的结构。没有图像/媒体文件或类似的东西,都是定价数据。在集合中有大约 4,000 个代表属性(建筑物)的文档;每个房产可能有 10-50 个单位,每个单位都有 30-90 个不同日期的价格数据,每个日期可能有 12 个不同的租赁期限。所以 ~4k 房产 x 50 个单位 x 90 个日期 x 12 个租期。这就是我想每天保存并能够查询的数据。建议?谢谢!
  • 是的,您可以使用日期来区分导入。您可能还希望添加一个字段来标识批号和来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多