【问题标题】:is BSON representation minified?BSON 表示被缩小了吗?
【发布时间】:2016-08-03 18:27:12
【问题描述】:

我正在使用 mongo,我保存的文档之一超过了最大 16mb。我想知道缩小结构是否可以在这方面有所帮助。所以这就是为什么我对标题有疑问。 如果 bson 表示已经缩小了文档,那么我身边的另一个尝试将无济于事。

【问题讨论】:

  • BSON 文档非常紧凑,我不确定如何在不为 MongoDB 重新编写自己的数据存储的情况下进一步压缩它。如果您的文档超过了最大限制,我会建议重新访问文档结构。
  • 您可能应该重新审视您的数据模型。 16Mb 很多。你在那个文件中存储了什么?另外,我认为这不会有帮助,但是您使用的商店引擎是什么?应该在较新的 mongo 版本中将有线老虎作为其默认存储引擎并执行压缩。有关详细信息,请参阅此:docs.mongodb.com/manual/core/wiredtiger/#compression
  • @IshanSoni 是的,我同意,我的问题更有针对性,看看代表相同结构的缩小文档在空间使用方面是否等同于非缩小文档。
  • 如果您的文档超过了 16MB 的最大限制,那么您可以重新构建模型或使用“GridFS”。供参考:docs.mongodb.com/manual/core/gridfs

标签: mongodb bson


【解决方案1】:

MongoDB 以 BSON 表示形式存储数据,其中保留字段名称和内容。总对象大小取决于字段的长度以及字段的内容。如果您愿意缩写您的字段名称,那么您可以使您的文档更小。

您可以通过插入具有长字段名称和短字段名称的文档来快速检查这一点:

> db.test.insert({abcde:1})
> db.test.stats()
{
  "ns": "test.test",
  "count": 1,
  "size": 37,
  "avgObjSize": 37,
  ...

如果可以缩写字段名称,可以实现对象大小的一些减小:

> db.test2.insert({a:1})
> db.test2.stats()
{
  "ns": "test.test2",
  "count": 1,
  "size": 33,
  "avgObjSize": 33,
  ...

从上面的两个示例中,将字段名称从 abcde 缩短为仅 a 导致对象大小减小:37 字节与 33 字节相比,使用较短的字段名称节省了 4 个字节。

【讨论】:

  • 好极了,做同样的测试,但我也看到字段的大小增加了!...也许缩小对象毕竟不是一个坏主意! (我是 mongo 的新手,不知道 stats 方法,它包含很多有用的信息:))。
【解决方案2】:

文档键在 BSON 中占用了大量空间,因为它们是逐字存储的,因此如果您可以对它们进行编码,您将节省大量字节。如果您的代码将是这些数据的唯一读取者,这是可以接受的,这样任何人都不必记住这一点

const MY_INSANELY_LONG_OBJECT_PROPERTY_NAME = "a";

var thePropertyValue = myObject[MY_INSANELY_LONG_OBJECT_PROPERTY_NAME];

【讨论】:

    【解决方案3】:

    如果您的文档在缩小后仍超过 16MB,您可以使用 GridFS 分解该文档网。

    根据 MongoDB 文档,

    GridFS 是一种用于存储和检索超过 BSON 文档大小限制 16 MB 的文件的规范。

    希望这会有所帮助..

    【讨论】:

      【解决方案4】:

      BSON 已经是一种高度紧凑的格式,而且 WiredTiger 引擎在页面级别压缩数据,而不是文档级别。

      如果您的文档大小达到 16MB 的限制,您可能需要拆分文档或重新设计数据库。

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 2023-03-24
        • 2014-04-01
        • 1970-01-01
        • 2010-11-05
        相关资源
        最近更新 更多