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

Actual document size limit for Azure Cosmos DB’s API for MongoDB?

描述

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

测试SQL

  1. 创建 Cosmos DB Core (SQL) 数据库
  2. 尝试将 2093334 字节的项目插入“项目”table
  1. 现在我尝试将更大的 2239798 字节的项目插入相同的 table

RequestEntityTooLarge error occurred: Microsoft.Azure.Cosmos.CosmosException : Response >status code does not indicate success: RequestEntityTooLarge (413); Substatus: 0; >ActivityId: c1977df8-ec39-40b9-bd69-6e6a40ff6c00; Reason: (Message: {"Errors":["Request >size is too large"]}

结论:结果匹配文档

测试MongoDB

  1. 创建 Cosmos DB (MongoDB) 数据库
  2. 尝试将 2093334 字节的项目插入“项目”集合
  1. 现在我尝试将 2239798 字节的项目插入同一个集合
  1. 现在我尝试将 4520606 字节的项目插入同一个集合
  1. 最后,当我尝试将 4526027 个字节的项目插入同一个集合时

ERROR: MongoDB.Driver.MongoWriteException: A write operation resulted in an error. >WriteError: { Category : "Uncategorized", Code : 16, Message : "Error=16, Details='Response >status code does not indicate success: RequestEntityTooLarge (413); Substatus: 0; >ActivityId: 8f20b261-e1c5-4ca9-b4e6-6cbc5352ce7e; Reason: (Message: {"Errors":["Request >size is too large"]}

结论:结果不符合文档

注意

字节数的计算方式如下:

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. 文档中是否还有其他地方对这些大小进行了不同的定义?
  2. 我没有正确解读这些结果吗?

非常感谢任何帮助,谢谢!

Cosmos DB 的 API for MongoDB 具有压缩数据的二进制存储格式。压缩量取决于文档中数据的形状。具有更深层次结构的文档往往比那些更扁平的文档压缩得更多。因此,您可以存储大于记录的 2MB 限制的未压缩数据。

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

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