Cosmos DB 中的动态属性

Dynamic Properties in Cosmos DB

我在 SO 上经历了很多 post。找不到我需要的东西。

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

    [
        {
           "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。具体来说:

"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" }
   ]
}

此时,您将拥有一组一致的 属性 名称供查询。

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