將未分割的容器移轉至已分割的容器
適用於:NoSQL
Azure Cosmos DB 支援建立沒有分割區索引鍵的容器。 目前,您可以使用小於或等於 2.x 版的 Azure CLI 和 Azure Cosmos DB SDK (.NET、JAVA、NodeJs) 來建立未分割的容器。 您無法使用 Azure 入口網站建立未分割的容器。 不過,這種未分割的容器沒有彈性,固定為儲存體容量 20 GB 和輸送量限制 10K RU/秒。
未分割容器是舊版的,您應該將現有的未分割容器移轉至已分割的容器,以調整儲存體和輸送量。 Azure Cosmos DB 提供系統定義的機制,可將未分割的容器移轉至已分割的容器。 本文件說明如何將所有現有的未分割容器自動移轉至已分割的容器。 只有當您使用所有語言的 V3 版 SDK 時,才可以利用自動移轉功能。
注意
目前,您無法使用此文件件所述的步驟來移轉 Azure Cosmos DB MongoDB 和 API for Gremlin 帳戶。
使用系統定義的分割區索引鍵來遷移容器
為了支援移轉,在沒有分割區索引鍵的所有容器上,Azure Cosmos DB 提供系統定義的分割區索引鍵,名為 /_partitionkey
。 移轉容器之後,您就無法變更分割區索引鍵定義。 例如,容器遷移至已分割的容器時,其定義如下所示:
{
"Id": "CollId"
"partitionKey": {
"paths": [
"/_partitionKey"
],
"kind": "Hash"
},
}
遷移容器之後,您可以建立文件,而且除了文件的其他屬性,還可加進 _partitionKey
屬性。 _partitionKey
屬性代表文件的分割區索引鍵。
為了充分利用佈建的輸送量,選擇正確的分割區索引鍵很重要。 如需詳細資訊,請參閱如何選擇分割區索引鍵一文。
注意
只有在使用最新/V3 版的 SDK 時 (所有語言),才能利用系統定義的分割區索引鍵。
下列程式碼範例示範以系統定義的分割區索引鍵建立文件,並讀取該文件:
文件的 JSON 表示法
DeviceInformationItem = new DeviceInformationItem
{
"id": "elevator/PugetSound/Building44/Floor1/1",
"deviceId": "3cf4c52d-cc67-4bb8-b02f-f6185007a808",
"_partitionKey": "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
public class DeviceInformationItem
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "deviceId")]
public string DeviceId { get; set; }
[JsonProperty(PropertyName = "_partitionKey", NullValueHandling = NullValueHandling.Ignore)]
public string PartitionKey { get {return this.DeviceId; set; }
}
CosmosContainer migratedContainer = database.Containers["testContainer"];
DeviceInformationItem deviceItem = new DeviceInformationItem() {
Id = "1234",
DeviceId = "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
ItemResponse<DeviceInformationItem > response =
await migratedContainer.CreateItemAsync<DeviceInformationItem>(
deviceItem.PartitionKey,
deviceItem
);
// Read back the document providing the same partition key
ItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.ReadItemAsync<DeviceInformationItem>(
partitionKey: deviceItem.PartitionKey,
id: device.Id
);
如需完整範例,請參閱 .NET 範例 GitHub 存放庫。
遷移文件
使用分割區索引鍵屬性增強容器定義時,不會自動遷移容器內的文件。 這表示系統分割區索引鍵屬性 /_partitionKey
路徑不會自動新增至現有文件。 您必須讀取未以分割區索引鍵建立的現有文件,以重新分割的文件,然後在文件中使用 _partitionKey
屬性,將文件重寫回來。
存取沒有分割區索引鍵的文件
應用程式可以使用名為 "PartitionKey.None" (此值代表未遷移的文件) 的特殊系統屬性,以存取沒有分割區索引鍵的現有文件。 您可以在所有 CRUD 和查詢作業中使用此屬性。 下列範例示範從 NonePartitionKey 讀取單一文件。
CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
partitionKey: PartitionKey.None,
id: device.Id
);
SDK 的相容性
舊版 Azure Cosmos DB SDK (例如 V2.x.x 和 V1.x.x) 不支援系統定義的分割區索引鍵屬性。 因此,從舊版 SDK 讀取的容器定義不含任何分割區索引鍵定義,這些容器的行為一如既往。 使用舊版 SDK 建立的應用程式一成不變,仍像未分割一樣繼續運作。
如果已移轉的容器由最新/V3 版的 SDK 取用,而且您在新文件中開始填入系統定義的分割區索引鍵,則無法從舊版 SDK 存取 (讀取、更新、刪除、查詢) 這些文件。
已知問題
使用 V3 SDK 查詢未以分割區索引鍵插入的項目計數時,可能耗用較多輸送量
從 V3 SDK 查詢使用 V2 SDK 插入的項目,或使用 V3 SDK 搭配 PartitionKey.None
參數插入的項目時,如果是在 FeedOptions 中提供 PartitionKey.None
參數,則計數查詢可能耗用較多 RU/秒。 如果未以分割區索引鍵插入其他項目,建議您不要提供 PartitionKey.None
參數。
如果以分割區索引鍵的不同值來插入新項目,則在 FeedOptions
中傳入適當的索引鍵來查詢這種項目計數,就不會有任何問題。 以分割區索引鍵插入新文件之後,如果您只需要查詢沒有分割區索引鍵值的文件計數,則該查詢可能像一般分割的集合一樣,還是會耗用較多 RU/秒。
下一步
- Azure Cosmos DB 中的資料分割
- Azure Cosmos DB 中的要求單位
- 在容器和資料庫中佈建輸送量
- 使用 Azure Cosmos DB 帳戶
- 正在嘗試為遷移至 Azure Cosmos DB 進行容量規劃嗎?
- 如果您知道現有資料庫叢集中的虛擬核心和伺服器數目,請參閱使用虛擬核心或 vCPU 來估計要求單位
- 如果您知道目前資料庫工作負載的一般要求率,請參閱使用 Azure Cosmos DB 容量規劃工具來估計要求單位