编程语言
首页 > 编程语言> > javascript – CosmosDB:如何查询嵌套在json数组中的值的存在?

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

作者:互联网

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

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

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

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

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

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

解决方法:

I don’t know how to query over every element of each document’s
JsonArray (if it was just querying on a single string field, it would
be easy)

我正如你所描述的那样在我的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查询数组中的字段.

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

结果:

enter image description here

添加where子句.

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

结果:

enter image description here

I’m also not sure about the efficiency of this query and whether this
approach for validating new Ids against what’s already in the DB is,
in general, a bad pattern. I have a one partition CosmosDB instance –
the subId validation check should not occur very often.

根据需要,我认为您可以在Azure Cosmos DB中使用用户定义函数.

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

请参阅official doc.

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

标签:javascript,azure,azure-cosmosdb
来源: https://codeday.me/bug/20190828/1750108.html