簡體   English   中英

Azure Cosmos DB 的 API 對 MongoDB 的實際文檔大小限制?

[英]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字節的項目插入“項目”表
  • 它成功了,因為它是: < 2Mb ,如官方文檔中所述(上面的鏈接)
  1. 現在我嘗試在同一張表中插入一個更大的2239798字節項目
  • 由於項目> 2Mb ,因此失敗並顯示錯誤代碼(413)

發生 RequestEntityTooLarge 錯誤:Microsoft.Azure.Cosmos.CosmosException:響應>狀態碼不表示成功:RequestEntityTooLarge (413); 子狀態:0; >ActivityId:c1977df8-ec39-40b9-bd69-6e6a40ff6c00; 原因:(消息:{"Errors":["Request >size is too large"]}

結論:結果文檔相符

測試 MongoDB

  1. 創建 Cosmos DB (MongoDB) 數據庫
  2. 嘗試將2093334字節的項目插入“項目”集合
  • 它成功了,因為它< 2Mb
  1. 現在我嘗試將一個2239798字節的項目插入到同一個集合中
  • 即使它> 2Mb並且文檔狀態不同(或者我遺漏了一些東西),它仍然成功
  1. 現在我嘗試將一個4520606字節的項目插入到同一個集合中
  • 即使它是 ~4.31Mb 並且仍然成功
  1. 最后,當我嘗試將4526027字節的項目插入同一個集合時
  • 它失敗並顯示錯誤代碼(413):

錯誤:MongoDB.Driver.MongoWriteException:寫入操作導致錯誤。 >WriteError: { Category: "Uncategorized", Code: 16, Message: "Error=16, Details='Response >狀態碼不表示成功:RequestEntityTooLarge (413); Substatus: 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. 文檔中是否還有其他地方以不同方式定義這些尺寸?
  2. 我沒有正確解釋這些結果嗎?

非常感謝任何幫助,謝謝!

Cosmos DB 的 API 用於 MongoDB 具有壓縮數據的二進制存儲格式。 壓縮量取決於文檔中數據的形狀。 具有更深層次結構的文檔往往比那些更扁平的文檔壓縮得更多。 因此,您可以存儲大於記錄的 2MB 限制的未壓縮數據。

雖然可以使用 Cosmos DB 的 API for MongoDB 存儲超過 2MB 的未壓縮數據,但我不建議這樣做,因為您不可能知道在插入之前將擁有多少壓縮數據。

我還應該指出,一般而言,在成本和延遲方面,您將擁有更多的較小文檔,而不是較大尺寸的文檔(這也適用於原生 MongoDB)。 因此,當您 model 為您的應用程序提供數據時,請記住這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM