2017-10-10 83 views
0

我的數據庫實例包含了一些文檔下面的模式:CosmosDB:如何查詢嵌套在json數組中的值的存在?

{ 
    id: <someGuid> 
    myJsonArray: [ 
     { 
      subId: SmallUniqueId1, 
      val: <someValue> 
     }, 
     { 
      subId: SmallUniqueId2, 
      val: <someOtherValue> 
     } 
    ] 
} 

我有一個Web API生成新SubIds(你可以認爲他們有5個字符的最大長度爲隨機生成的base64字符串)。

我想查詢我的數據庫以驗證新鑄造的SubId不存在於我的所有文檔中的某處。

我想這個解決方案可能涉及將新的subId值插入到WHERE子句中(我正在通過REST API訪問CosmosDB)。這就是我不知道:

  • 我不知道該怎麼每個文檔的JsonArray的每一個元素查詢了(如果它只是一個字符串字段查詢,它會很容易)
  • 我我也不確定這個查詢的效率,以及這種驗證新數據庫的方法是否與數據庫中已有的方法一致,一般來說是不好的模式。我有一個分區CosmosDB實例 - subId驗證檢查不應該經常發生。
+0

嗨,現在有任何更新? –

+0

再給我幾天時間回到你身邊 - 發生一些火災。我對底層的UDF建議很感興趣! (謝謝!) 我有一個場景,我需要將這些文檔從一個cosmosdb實例遷移到另一個,並且不能保證這些subIds(在db1中有效)在db2中也是有效的。 我需要通過一點後續思考。 – nciao

+0

當然!等待你的回覆。 –

回答

3

我不知道該怎麼每個文檔的 JsonArray的每一個元素查詢了(如果它只是一個字符串字段查詢,這將 容易)

我創建如您所述,我的azure cosmosdb中有兩個示例文檔。

[ 
    { 
    "id": "id1", 
    "myJsonArray": [ 
     { 
     "subId": "sub1", 
     "val": "value1" 
     }, 
     { 
     "subId": "sub2", 
     "val": "value2" 
     } 
    ], 
    }, 
    { 
    "id": "id2", 
    "myJsonArray": [ 
     { 
     "subId": "sub3", 
     "val": "value3" 
     }, 
     { 
     "subId": "sub4", 
     "val": "value4" 
     } 
    ], 
    } 
] 

你可以使用下面的SQL查詢field數組。

SELECT a.subId as subId FROM c 
join a in c.myJsonArray 

結果:

enter image description here

添加where clause

SELECT a.subId as subId FROM c 
join a in c.myJsonArray 
where a.subId='sub1' 

結果:

enter image description here

我也不能肯定這個查詢的效率,這是否 方法針對什麼是已經在確認新的ID數據庫是, 一般來說,一個不好的模式。我有一個分區CosmosDB實例 - subId驗證檢查不應該經常發生。

根據您的需要,我以爲您可以在Azure Cosmos DB中使用User Defined Function

調用UDF將文檔創建到數據庫時,檢查字段值是否已經存在,返回boolean結果。

請參考此official doc

希望它可以幫助你。任何問題,請隨時讓我知道。