首页 > 解决方案 > Cosmos DB 中的动态属性

问题描述

我经历了很多关于 SO 的帖子。没有找到我需要的东西。

我有一个收集文件,如下所示

    [
        {
           "Key1": "Value",
           "Key2": 1,
           "Key3": "Value",
           "Key4": 5,
           "Date": "2021-10-25T04:20:00",
           "Key5": {
              "a3": "2021-09-03T09:32:55",
              "a199": "2021-09-03T09:32:55"
           }
        },
        {
           "Key1": "Value",
           "Key2": 1,
           "Key3": "Value",
           "Key4": 5,
           "Date": "2021-10-25T04:20:00",
           "Key5": {
              "a500": "2021-09-03T09:32:55",
              "a39": "2021-09-03T09:32:55"
           }
        }
     ]

我正在使用这个查询

Select top 10 * from Collection c where c.Key5.a3 = '2021-09-03T09:32:55'

现在我需要从这个集合中过滤 Key5.a3 或 Key5.a199 等于某物的数据。这里的问题是我不知道 Key5 下会出现哪些属性,这些属性是系统从 UI 随机创建的,每个文档在 Key5 中都有不同的属性。

我需要为这个集合构建一个查询,它不关心 Key5.a199/399/500 或任何东西,而只是比较与之关联的值。

标签: azureazure-cosmosdbazure-cosmosdb-sqlapi

解决方案


您不能有忽略特定属性名称的动态查询。

您遇到的问题是通过将数据值存储为属性名称(使用Key1throughKey4和更复杂的Key5. 具体来说:

"Key5": {
   "a500": "2021-09-03T09:32:55",
   "a39": "2021-09-03T09:32:55"
}

您已将元数据嵌入到属性名称中,这是尝试索引或搜索时的问题。

为避免这种情况,请重构您的数据模型以具有一致的属性名称。像这样的东西,你有明确定义的键值对。然后,您可以在一个数组中拥有多个值。像这样的东西:

{
   "Key5": [
      { "property_key": "a500", "property_value": "2021-09-03T09:32:55" },
      { "property_key": "a39", "property_value" : "2021-09-03T09:32:55" }
   ]
}

此时,您现在可以查询一组一致的属性名称。

您需要根据自己的需要进行定制,但这显示了如何避免在属性名称中存储真实数据的问题。


推荐阅读