【问题标题】:Dynamic Properties in Cosmos DBCosmos DB 中的动态属性
【发布时间】:2021-12-21 05:45:51
【问题描述】:

我浏览了很多关于 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 或任何东西,而只是比较与之关联的值。

【问题讨论】:

  • 我不太明白 Key1Key4 的用法 - 好像您正在以某种方式配对属性?也就是说:你不能有变量属性名称。您已经为此创建了需求,因为您使用了实际数据作为属性名称。尝试将Key5 更改为具有keyvalue 属性的子文档数组,其中keya500value 是日期等。然后你总是查询相同的名称.请参阅this answer 我不久前发布了类似的问题,显示了类似的内容。
  • @DavidMakogon 你是正确的 Devid。现在我们已经完成了一半。我不认为我们将能够改变文档的结构,因为它会有很多变化。请忽略 Key1 到 Key4。在 Key5 上,我们有一项服务,它在其他文档中创建一个条目并在此处添加参考。该密钥是自动生成的,并且将针对每个条目进行更改。我希望我能澄清你的疑问。
  • @DavidMakogon 您能否将您的评论添加为答案,以便我将其标记为已接受的答案
  • 您从哪里执行查询?是来自门户还是通过一些编码的应用程序。如果是,那么是什么语言?不能通过 1 个 sql 查询,但可以通过代码实现。
  • @AnupamChand - 这需要对每个文档进行完整解析以找到所需的数据,因为真实数据存储为属性名称。这是不平凡的,而且可能很昂贵。并且将实际数据存储为属性名称是一种反模式(因为没有直接的方法来查询此类数据)。从门户与代码查询并不重要。无论在何处执行此类查询,问题都存在。

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

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

您遇到的问题是通过将数据值存储为属性名称(Key1Key4 和您更复杂的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" }
   ]
}

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

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

【讨论】:

  • 我还有一个带有动态 json 键的旧系统。知道如何检查 json 中的键是否存在。我想做select from where ('a500', 'a39') in key5 => 显然我不知道它的语法。类似于mysql中的JSON_KEYS。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2020-03-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多