【问题标题】:CosmosDB: how to query for the existence of a value nested in a json array?CosmosDB:如何查询嵌套在 json 数组中的值是否存在?
【发布时间】:2017-10-10 16:56:37
【问题描述】:

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

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

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

我想查询我的数据库以验证新创建的 SubId 是否已存在于我的所有文档中。

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

  • 我不知道如何查询每个文档的 JsonArray 的每个元素(如果只是查询单个字符串字段,那就很容易了)
  • 我也不确定此查询的效率,以及这种根据数据库中已有的内容验证新 ID 的方法是否通常是一种不好的模式。我有一个单分区 CosmosDB 实例 - subId 验证检查不应该经常发生。

【问题讨论】:

  • 嗨,现在有更新吗?
  • 再给我几天时间回复你 - 有几场火灾要扑灭。我对底部的 UDF 建议很感兴趣! (谢谢!)我有一个场景,我需要将这些文档从一个 cosmosdb 实例迁移到另一个实例,并且不能保证这些 subId(在 db1 中有效)在 db2 中也有效。在跟进之前我需要考虑一下。
  • 当然!等待您的回复。

标签: javascript azure azure-cosmosdb


【解决方案1】:

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

在数据库中创建文档时调用UDF,检查字段值是否已经存在,返回boolean结果。

请参考这个official doc

希望对您有所帮助。有任何问题,请随时告诉我。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2022-06-22
    相关资源
    最近更新 更多