Mongodb 数据库可以容纳几百个以上的嵌入式阵列吗?

Mongodb 数据库可以容纳几百个以上的嵌入式阵列吗?,mongodb,rethinkdb,rethinkdb-ruby,nosql,Mongodb,Rethinkdb,Rethinkdb Ruby,Nosql,在会议上,各国: 由于前面的限制,最好保持 将数组发布到不超过几百个文档 如果我打算保存90天(3个月)的统计数据,那么很可能每个日期都有大约10个区域的嵌入式数组。这意味着90*10=900。900不完全是几百 然而,at的一个相关问题表明MongoDB有16mb的限制,这意味着能够承载3000万条推文,或者大约250000个典型的堆栈溢出问题作为嵌入式文档。太多了 然而,这就是MongoDB。RejectionDB对每个文档的限制为10mb。这应该还是相当高的。要么是DB的文档有缺陷。或者还

在会议上,各国:

由于前面的限制,最好保持 将数组发布到不超过几百个文档

如果我打算保存90天(3个月)的统计数据,那么很可能每个日期都有大约10个区域的嵌入式数组。这意味着90*10=900。900不完全是几百

然而,at的一个相关问题表明MongoDB有16mb的限制,这意味着能够承载3000万条推文,或者大约250000个典型的堆栈溢出问题作为嵌入式文档。太多了

然而,这就是MongoDB。RejectionDB对每个文档的限制为10mb。这应该还是相当高的。要么是DB的文档有缺陷。或者还有另一个特定的原因(未解释)为什么RejectionDB建议只将其限制在几百个嵌入式阵列,尽管10mb显然可以容纳更多

我所指模式的大致概念:

DailyStat::Campaign
[
  {
    id: '32141241dkfjhjksdlf',
    days_remaining: 26,
    status: 'running',
    dates: [
      {
        date: 20130926,
        delivered: 1,
        failed: 1,
        clicked: 1,
        top_regions: [
          { region_name: 'Asia', views: 10 },
          { region_name: 'America', views: 10 },
          { region_name: 'Europe', views: 10 },
          { region_name: 'Africa', views: 10 },
          { region_name: 'South East Asia', views: 10 },
          { region_name: 'South America', views: 10 },
          { region_name: 'Northern Europe', views: 10 },
          { region_name: 'Middle East', views: 10 }
        ]
      },
      {
        date: 20130927,
        delivered: 1,
        failed: 1,
        clicked: 1,
        top_regions: [
          { region_name: 'Asia', views: 10 },
          { region_name: 'America', views: 10 },
          { region_name: 'Europe', views: 10 },
          { region_name: 'Africa', views: 10 },
          { region_name: 'South East Asia', views: 10 },
          { region_name: 'South America', views: 10 },
          { region_name: 'Northern Europe', views: 10 },
          { region_name: 'Middle East', views: 10 }
        ]
      },
      ...
    ]
  }
]
简短答复:

这篇文章指的是每个嵌入式阵列的大小,而不是它们大小的总和。因此,在您的情况下,尺寸只有10号,这当然可以

更长的回答:

文档中有一个大型嵌套数组(实际上只是一个大型文档,一般来说,数组没有什么特别之处)的问题在于,如果需要更新它,它会使速度变慢。RejectionDB现在不进行部分更新,所以任何时候你想要更新文档,都需要读取整个磁盘内容并将整个内容写入磁盘。同样,如果您经常阅读文档,但只关心文档的一小部分,则这可能是一个问题。例如,如果文档中有一个非常大的数组,但也有一个小字段,则每次尝试读取该小字段时,您都需要经常从中读取。您将支付读取大数组的罚款。

此处提到的“以前的限制”指的是以下内容:

使用嵌入式数组的缺点:对作者文档的任何操作都需要将所有帖子加载到内存中。对文档的任何更新都需要将整个阵列重新写入磁盘

这与其说是限制,不如说是性能权衡

例如,如果将每个用户的tweet嵌入到用户表中,可能会遇到性能问题,因为:

  • tweets的嵌入使得用户文档变得很大
  • 每次插入tweet时,都必须更新整个用户文档(很大)
  • 每个用户每天可能会插入很多推文
  • 将其乘以用户总数
  • 另一方面,如果将tweet存储在一个单独的表中,则每次插入都很小且便宜


    在您的实例中,您每天都在存储统计数据。每天更新一个文档几次不会导致任何性能问题,即使它只有几MB。

    请记住。活动有90天(嵌入式阵列)。每天最多可以有10个区域(一天内嵌入阵列)。那是90*10。900是活动文档中数组的大小。不是10小时,总共900小时,这可能会变得效率低下。这取决于您更新文档中的值的频率。