繁体   English   中英

CosmosDB:如何查询嵌套在json数组中的值的存在?

[英]CosmosDB: how to query for the existence of a value nested in a json array?

我的数据库实例包含一些具有以下模式的文档:

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

我有一个生成新SubIds的Web API(您可以将它们视为随机生成的base64字符串,其最大长度为5个字符)。

我想查询我的数据库,以验证新创建的SubId在我的所有文档中都不存在。

我认为解决方案可能涉及将新的subId值插入WHERE子句(我通过REST API访问CosmosDB)。 这是我不知道的:

  • 我不知道如何查询每个文档的JsonArray的每个元素(如果它只是查询单个字符串字段,那将很容易)
  • 我也不确定这个查询的效率,以及这种用于验证新ID的方法是否通常是一个糟糕的模式。 我有一个分区CosmosDB实例 - subId验证检查不应经常发生。

我不知道如何查询每个文档的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

结果:

在此输入图像描述

添加where clause

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

结果:

在此输入图像描述

我也不确定这个查询的效率,以及这种用于验证新ID的方法是否通常是一个糟糕的模式。 我有一个分区CosmosDB实例 - subId验证检查不应经常发生。

根据需要,我认为您可以在Azure Cosmos DB中使用User Defined Function

在向DB创建文档时调用UDF ,检查字段值是否已存在,返回boolean结果。

请参阅此官方文档

希望它能帮到你。 如有任何疑虑,请随时告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM