簡體   English   中英

Azure Cosmos DB - 我可以使用並非所有文檔都存在的 JSON 字段作為我的分區鍵嗎?

[英]Azure Cosmos DB - Can I use a JSON field that doesn't exist for all documents as my partition key?

我正在嘗試設置一個新的 Cosmos DB,它要求我設置一個分區鍵。 我想我理解應該 select 一個 JSON 字段的概念,該字段可以有效地對我的文檔進行分組。

是否可以將集合配置為使用每個傳入文檔中可能不存在的 JSON 字段?

例如:

{
    "name" : "Robin",
    "DOB" : "01/01/1969",
    "scans" : {
        "bloodType" : "O"
    }
}


{
    "name" : "Bill",
    "DOB" : "01/01/1969"
}

我可以使用 /scans.bloodType 作為分區鍵嗎? 對於沒有掃描 JSON 字段的文檔,我仍然需要該數據,因為我可以稍后更新該文檔。

不幸的是,你不能這樣做。 根據官方文檔,分區鍵路徑(/scans.bloodType)或分區鍵值不能更改。

成為具有不變值的屬性。 如果某個屬性是您的分區鍵,則您無法更新該屬性的值。

在解決方案方面,您可以嘗試找到另一個分區鍵屬性路徑並確保在創建時有一個值,或者可以使用輔助集合來存儲您不完整的文檔並使用更改提要將它們“移動”到在所有數據可用后進行最終收集。

實際上,您可以指定一個可能不存在於每個文檔中的分區鍵。 當您保存缺少分區鍵指定屬性的文檔時,將導致為其分區鍵分配“未定義”值。

將來,如果您想為此類文檔的分區鍵提供值,則必須刪除然后重新添加該文檔。 當屬性的值恰好是該文檔容器中的分區鍵時,您不能修改它(也不能將該屬性添加到沒有明確定義該屬性的現有文檔,因為它已經被分配了“未定義”值) .

有關未定義的分區鍵屬性的更多詳細信息,請參閱此答案

如果只有少量可能的值,假設它指的是 A/B/O 類型等,像血型這樣的東西不會是一個好的分區鍵。 您通常可以始終依賴的是 Cosmos 自動創建的項目的唯一id屬性。 如果沒有其他更好的選擇,每個分區有一個項目很好。 根據文檔:

如果您的容器有一個具有多種可能值的屬性,那么它可能是一個很好的分區鍵選擇。 此類屬性的一個可能示例是項目 ID。 對於任何大小的小型讀重容器或寫重容器,item ID 自然是分區鍵的絕佳選擇。

暫無
暫無

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

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