【问题标题】:MongoDB storing arrays of numbersMongoDB存储数字数组
【发布时间】:2021-08-30 08:19:10
【问题描述】:

在我的 nodejs 应用程序中,我有 uint32 整数数组,我需要将它们存储在 mongodb 集合中的文档中。永远不需要通过 mongodb 查询访问数组项,也不需要在该字段上创建索引。我想知道使用其他格式存储具有几十个或百分之一数字的数组是否有任何性能成本或其他缺点?

由于数组的内容将仅用于应用程序级别而不是数据库级别,因此它可以以我想要的任何格式存储在 mongo 中。然后将从 mongo 获取的查询结果转换为应用程序需要的格式(一个 Uint32Array)。

我可以想象格式也可能会影响所需的存储空间。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    根据6 Rules of Thumb for MongoDB Schema Design,我认为使用嵌入文档数组 对你来说是可以的,因为你的结构是one-to-many 而不是one-to-squillions。而且您的数组由 uint32 而不是对象组成。

    这两个讨论可能会对你有所帮助。

    1. Pros and cons for Embedded Arrays VS flat documents in mongodb
    2. The limit between “few” and “many”

    【讨论】:

      【解决方案2】:

      大文档 => 有更多时间将它们加载到内存中,以查询/更新它们。

      MongoDB WiredTiger,将完整的文档加载到内存中,而不仅仅是它需要查询或更新的部分。

      例如

      {"a" :1 , "myarray" [0...100000]}

      如果我只想更新“a”,或者只基于“a”进行查询,我也会加载“myarray”。

      可以提供帮助的解决方案

      1. “a”上的索引(以避免 collscan)可以在查询和更新方面提供帮助,但前提是您只查询/更新其中的少数文档。

      2. 将文档分成两部分,常用部分,可用于 查找/更新以及我只在需要时才去那里的重要部分。

      基本的数据建模建议是不要在内存中加载,尤其是很多时候不需要的数据。 (这可以通过将文档分成常用的小部分和较少使用的大部分来完成)

      基准示例

      3k 文档
      colA = {"a" :1 , "myarray" [0...100000]}
      colB = {"a" :1 }

      • 查询(仅在“a”上过滤,无索引)
        "Elapsed time: 7729.74552 msecs" //collA
        "Elapsed time: 35.06918 msecs" //collB

      • 索引在“a”次的查询是相同的

      • 更新(将“a”的值改为2)
        "Elapsed time: 7176.342247 msecs" //collA
        "Elapsed time: 23.257879 msecs" //collB

      也许还有其他解决方案或更多关于哪种方法最好的争论,但基准测试显示出非常大的差异。

      我的建议是索引以避免收集扫描或/和拆分文档(如果您有非常大的数组)

      See this from MongoDB university also 有分割文件的例子。

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        相关资源
        最近更新 更多