MongoDB文档大小限制

MongoDB文档大小限制,mongodb,Mongodb,为什么我可以存储大于16MB的BSON文档 我使用不带GridFS的MongoDB来存储图像二进制数据。mongodb文档声明:BSON文档的最大大小为16 MB。但我可以毫无问题地存储大型BSON文档。我通过读回存储的文档再次进行检查,但没有任何文档损坏。 \uux,err:=itemdbConn.InsertOne(ctx,item) 如果出错!=零{ log.Println(错误) 返回 } 我希望mongo go驱动程序在插入大文档时返回错误,但它没有返回 编辑: 从中的注释中,我发

为什么我可以存储大于16MB的BSON文档

我使用不带GridFS的MongoDB来存储图像二进制数据。mongodb文档声明:
BSON文档的最大大小为16 MB
。但我可以毫无问题地存储大型BSON文档。我通过读回存储的文档再次进行检查,但没有任何文档损坏。

\uux,err:=itemdbConn.InsertOne(ctx,item)
如果出错!=零{
log.Println(错误)
返回
}
我希望mongo go驱动程序在插入大文档时返回错误,但它没有返回

编辑: 从中的注释中,我发现尺寸限制检查不严格:

/*注意这里的限制是任意的,只是一个标准。一般来说,代码是有效的
任何适合ram的对象。
还请注意,服务器有一些基本检查来强制执行此限制,但这些检查不是
例如,需要检查后的尺寸是否过大
更新$push(append)操作
*/
常量int BSONObjMaxUserSize=16*1024*1024;
/*
有时,我们需要稍大一点的对象—replication local.oplog中的对象
例如,略大于用户对象。
*/
const int BSONObjMaxInternalSize=BSONObjMaxUserSize+(16*1024);

这意味着mongodb是否会随机返回错误,取决于操作。评论只提到了推操作,所以我不知道它是否也检查了插入操作。我做了1000次这样的插入操作,没有任何错误…

MongoDB版本?直觉上,我会说压缩在这里起作用。如果16MB的限制适用于按内容划分的文档大小或磁盘上的大小,我现在就不必担心了。但是,禁用压缩很容易发现这一点。我想做一些测试来验证这个行为,你的样本数据在哪里?首选CSV、XML或JSON。至于您的实际任务,我强烈建议在将来的版本中,如果大小强制变得更严格,使用GridFS是安全的。@MarkusWMahlberg我只插入包含二进制数据数组的文档(mongo go驱动程序中的类型是[]字节)。在我上面发布的图片中,我正在编写一个网络爬虫,每个文档对应一个网页,数组是从该网页下载的原始格式的媒体内容(图像、视频、音频)。您可以很容易地复制一个文档,该文档具有相同图像的增量,直到超过16MB才能观察到。@MarkusWMahlberg当然,我正在检查驱动程序和mongodb的源代码。在这种情况下,如果不返回错误进行处理,恐怕存储的数据已损坏。这与GridFS无关(当然,我需要它),但是应该将错误返回到handle.MongoDB版本吗?直觉上,我会说压缩在这里起作用。如果16MB的限制适用于按内容划分的文档大小或磁盘上的大小,我现在就不必担心了。但是,禁用压缩很容易发现这一点。我想做一些测试来验证这个行为,你的样本数据在哪里?首选CSV、XML或JSON。至于您的实际任务,我强烈建议在将来的版本中,如果大小强制变得更严格,使用GridFS是安全的。@MarkusWMahlberg我只插入包含二进制数据数组的文档(mongo go驱动程序中的类型是[]字节)。在我上面发布的图片中,我正在编写一个网络爬虫,每个文档对应一个网页,数组是从该网页下载的原始格式的媒体内容(图像、视频、音频)。您可以很容易地复制一个文档,该文档具有相同图像的增量,直到超过16MB才能观察到。@MarkusWMahlberg当然,我正在检查驱动程序和mongodb的源代码。在这种情况下,如果不返回错误进行处理,恐怕存储的数据已损坏。这与GridFS无关(当然,我需要它),但应该返回错误以进行处理。