Azure Cosmos DB 的 MongoDB API 的实际文档大小限制?

问题描述 投票:0回答:2

描述

我做了一些测试,发现 CosmosDB 的最大文档大小限制似乎与文档不一致: https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#per-item-limits

测试 SQL

  1. 创建 Cosmos DB Core (SQL) 数据库
  2. 尝试将 2093334 字节的项目插入“Items”表
  • 它成功了,因为它是:
    < 2Mb
    ,如官方文档中所述(上面的链接)
  1. 现在我尝试将更大的 2239798 字节项目插入同一个表中
  • 失败并显示错误代码 (413),因为该项目是
    > 2Mb

发生RequestEntityTooLarge错误:Microsoft.Azure.Cosmos.CosmosException:响应>状态代码未指示成功:RequestEntityTooLarge(413);子状态:0; >活动ID:c1977df8-ec39-40b9-bd69-6e6a40ff6c00;原因:(消息:{“错误”:[“请求>大小太大”]}

结论:结果匹配文档

测试 MongoDB

  1. 创建 Cosmos DB (MongoDB) 数据库
  2. 尝试将 2093334 字节的项目插入“Items”集合中
  • 它成功了,因为它是
    < 2Mb
  1. 现在我尝试将 2239798 字节的项目插入到同一个集合中
  • 仍然成功,即使它是
    > 2Mb
    并且文档状态不同(或者我遗漏了一些东西)
  1. 现在我尝试将 4520606 字节的项目插入到同一个集合中
  • 仍然成功即使它是〜4.31Mb并且
  1. 最后,当我尝试将 4526027 字节的项目插入同一个集合中时
  • 失败并显示错误代码(413):

错误:MongoDB.Driver.MongoWriteException:写入操作导致错误。 > WriteError:{类别:“未分类”,代码:16,消息:“错误= 16,详细信息='响应>状态代码不指示成功:RequestEntityTooLarge(413);子状态:0;>ActivityId:8f20b261-e1c5-4ca9 -b4e6-6cbc5352ce7e; 原因:(消息:{“错误”:[“请求>大小太大”]}

结论:结果与文档不符

注意

字节数的计算方式如下:

var itemStr = JsonConvert.SerializeObject(item); var bytes = Encoding.UTF8.GetBytes(itemStr); Console.WriteLine($"total num of bytes: {bytes.Length}");
关于成功将一个大项写入MongoDB,我也通过mongoshell验证了存储的文档大于4Mb:

Object.bsonsize(db.Items.findOne({_id:ObjectId("61dec458316798c759091aef")}))
问题:

    文档中是否有其他地方对这些尺寸进行了不同的定义?
  1. 我没有正确解释这些结果吗?
非常感谢任何帮助,谢谢!

mongodb azure-cosmosdb azure-cosmosdb-sqlapi azure-cosmosdb-mongoapi
2个回答
1
投票
Cosmos DB 的 MongoDB API 具有压缩数据的二进制存储格式。压缩量取决于文档中数据的形状。层次结构较深的文档往往比层次结构较扁平的文档压缩得更多。因此,您可以存储大于记录的 2MB 限制的未压缩数据。

虽然可以使用 Cosmos DB 的 MongoDB API 存储超过 2MB 的未压缩数据,但我不建议这样做,因为您不可能知道在插入之前将拥有多少压缩数据。

我还应该指出,一般来说,与较大尺寸的文档相比,使用更多数量的较小文档会在成本和延迟方面获得更好的性能(这也适用于本机 MongoDB)。因此,当您为应用程序建模数据时,请记住这一点。


0
投票
是的,不建议存储大文档以优化资源。 可能会有点晚,但如果您没有其他选择,可以将文档的限制增加到 16Mb。 在这里您可以逐步找到信息(

https://learn.microsoft.com/en-us/azure/cosmos-db/mongodb/how-to-configure-capability) 顺便说一句...更改后适用于新集合。如果您需要对现有集合进行此操作,则需要导出数据、删除集合并再次创建它。恕我直言,如果可以改变设计,你应该......

© www.soinside.com 2019 - 2024. All rights reserved.