You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CosmosDB(SQL API)如何仅索引对象中非对象/数组类型属性?

CosmosDB(SQL API)仅索引data下非对象/数组属性的可行方案

针对你遇到的动态data结构索引优化需求,以下是可落地的解决方案:

核心思路

通过自定义索引策略,仅对data路径下所有层级的值类型属性(字符串、数字、布尔、日期等)创建索引,同时明确排除data下所有对象/数组类型的节点(避免索引无用的嵌套结构,降低写入RU消耗),同时保留根节点元数据的正常索引。

具体索引策略配置

使用以下JSON作为容器的索引策略(可通过Azure门户、CLI或SDK更新):

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    // 保留根节点元数据的全索引(适配你的元数据存储需求)
    {
      "path": "/*",
      "indexes": [
        {
          "kind": "Range",
          "dataType": "Number",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "String",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "Boolean",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "DateTime",
          "precision": -1
        },
        {
          "kind": "Hash",
          "dataType": "String",
          "precision": 3
        }
      ]
    },
    // 匹配data下所有嵌套层级的子属性,仅索引值类型
    {
      "path": "/data/**",
      "indexes": [
        {
          "kind": "Range",
          "dataType": "Number",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "String",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "Boolean",
          "precision": -1
        },
        {
          "kind": "Range",
          "dataType": "DateTime",
          "precision": -1
        },
        {
          "kind": "Hash",
          "dataType": "String",
          "precision": 3
        }
      ]
    }
  ],
  "excludedPaths": [
    // 排除data下所有层级的对象/数组类型节点,不索引这些节点本身
    {
      "path": "/data/**",
      "indexes": [
        {
          "kind": "Range",
          "dataType": "Object"
        },
        {
          "kind": "Range",
          "dataType": "Array"
        }
      ]
    }
  ]
}

策略说明

  1. 路径匹配规则:/data/** 通配符会匹配data下所有嵌套层级的子属性,不管嵌套深度,确保所有叶子值类型属性都能被索引。
  2. 类型筛选:在includedPaths中仅指定值类型的索引规则,同时在excludedPaths明确排除Object和Array类型,确保不会索引嵌套的对象/数组本身,只索引它们的子值属性。
  3. 元数据兼容:保留根节点的/*路径索引,确保根节点的元数据可以正常被查询和索引。

后续操作

  • 重新索引现有数据:更新索引策略后,需要触发容器的重新索引操作(Azure门户中容器的"重新索引"选项),确保历史数据应用新的索引规则。
  • 验证查询性能:测试针对data下值类型属性的查询,确认能命中索引;同时监控写入RU消耗,应该会比默认索引策略显著降低。
  • 避免无效路径:你之前尝试的/data/?、/data/*/?等不符合CosmosDB的路径语法,?用于匹配单个根级属性,*匹配单一层级所有属性,**才是匹配所有嵌套层级的正确通配符。

内容的提问来源于stack exchange,提问作者Derek Scheller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:57:33