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
- 创建 Cosmos DB Core (SQL) 数据库
- 尝试将 2093334 字节的项目插入“项目”table
- 它成功了,因为它是:
< 2Mb
如官方文档所述(link 以上)
- 现在我尝试将更大的 2239798 字节的项目插入相同的 table
- 由于项目是
> 2Mb
,因此失败并显示错误代码 (413)
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
- 创建 Cosmos DB (MongoDB) 数据库
- 尝试将 2093334 字节的项目插入“项目”集合
- 它成功了,因为它是
< 2Mb
- 现在我尝试将 2239798 字节的项目插入同一个集合
- 它 仍然成功 即使它是
> 2Mb
并且文档说明不同(或者我遗漏了一些东西)
- 现在我尝试将 4520606 字节的项目插入同一个集合
- 仍然成功 即使它是 ~4.31Mb 并且
- 最后,当我尝试将 4526027 个字节的项目插入同一个集合时
- 失败,错误代码 (413):
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")}))
问题:
- 文档中是否还有其他地方对这些大小进行了不同的定义?
- 我没有正确解读这些结果吗?
非常感谢任何帮助,谢谢!
Cosmos DB 的 API for MongoDB 具有压缩数据的二进制存储格式。压缩量取决于文档中数据的形状。具有更深层次结构的文档往往比那些更扁平的文档压缩得更多。因此,您可以存储大于记录的 2MB 限制的未压缩数据。
虽然可以使用 Cosmos DB 的 API 为 MongoDB 存储超过 2MB 的未压缩数据,但我不建议这样做,因为您不可能知道压缩了多少数据插入前您将拥有的数据。
我还应该指出,一般来说,与使用较大尺寸的文档相比,使用更多的较小文档在成本和延迟方面会有更好的性能(这也适用于本机 MongoDB ).因此,在为应用程序建模数据时,请牢记这一点。
描述
我正在做一些测试,发现 CosmosDB 的最大文档大小限制似乎与文档不一致: https://docs.microsoft.com/en-us/azure/cosmos-db/concepts-limits#per-item-limits
测试SQL
- 创建 Cosmos DB Core (SQL) 数据库
- 尝试将 2093334 字节的项目插入“项目”table
- 它成功了,因为它是:
< 2Mb
如官方文档所述(link 以上)
- 现在我尝试将更大的 2239798 字节的项目插入相同的 table
- 由于项目是
> 2Mb
,因此失败并显示错误代码 (413)
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
- 创建 Cosmos DB (MongoDB) 数据库
- 尝试将 2093334 字节的项目插入“项目”集合
- 它成功了,因为它是
< 2Mb
- 现在我尝试将 2239798 字节的项目插入同一个集合
- 它 仍然成功 即使它是
> 2Mb
并且文档说明不同(或者我遗漏了一些东西)
- 现在我尝试将 4520606 字节的项目插入同一个集合
- 仍然成功 即使它是 ~4.31Mb 并且
- 最后,当我尝试将 4526027 个字节的项目插入同一个集合时
- 失败,错误代码 (413):
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")}))
问题:
- 文档中是否还有其他地方对这些大小进行了不同的定义?
- 我没有正确解读这些结果吗?
非常感谢任何帮助,谢谢!
Cosmos DB 的 API for MongoDB 具有压缩数据的二进制存储格式。压缩量取决于文档中数据的形状。具有更深层次结构的文档往往比那些更扁平的文档压缩得更多。因此,您可以存储大于记录的 2MB 限制的未压缩数据。
虽然可以使用 Cosmos DB 的 API 为 MongoDB 存储超过 2MB 的未压缩数据,但我不建议这样做,因为您不可能知道压缩了多少数据插入前您将拥有的数据。
我还应该指出,一般来说,与使用较大尺寸的文档相比,使用更多的较小文档在成本和延迟方面会有更好的性能(这也适用于本机 MongoDB ).因此,在为应用程序建模数据时,请牢记这一点。