如何在Azure Cosmos DB中获取所有JSON属性的联合Schema?
获取Azure Cosmos DB产品JSON的完整联合Schema
以下是几种直接可行的方法,帮你提取所有文档(包括早期无新增字段的文档)的完整属性集合:
方法1:用Cosmos DB SQL查询直接提取所有顶层属性
如果只需要顶层属性,执行以下SQL查询,会返回所有文档中出现过的所有顶层属性名,自动去重:
SELECT DISTINCT VALUE key FROM c JOIN key IN OBJECT_KEYS(c)
执行后得到的结果就是所有顶层属性的列表,比如ProductId、Name、ModifiedDate等。
方法2:用内置的Schema Analyzer工具(最直观)
在Azure门户操作:
- 进入你的Cosmos DB账户,打开数据资源管理器
- 选择目标容器,切换到分析标签页,找到Schema Analyzer
- 工具会自动扫描容器内的文档,生成包含所有属性(包括嵌套结构)的联合Schema,还能显示每个属性的出现频率、数据类型,直接就能看到完整的属性集合。
方法3:处理嵌套属性的递归查询
如果文档有嵌套对象(比如ProductDetails.Price这类层级属性),需要提取所有层级的属性名,可以先创建一个递归UDF:
- 在容器的用户定义函数中添加以下函数:
function getAllKeys(obj) { let keys = []; for (let key in obj) { keys.push(key); if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) { keys = keys.concat(getAllKeys(obj[key])); } } return keys; }
- 执行以下SQL查询获取所有层级的属性:
SELECT DISTINCT VALUE key FROM c JOIN key IN udf.getAllKeys(c)
方法4:本地脚本批量处理
如果需要自动化处理,可以用Azure CLI结合本地工具:
- 用Azure CLI导出所有文档的属性键数组:
az cosmosdb sql query execute --account-name <你的Cosmos账户名> --database-name <数据库名> --container-name <容器名> --query "SELECT OBJECT_KEYS(c) AS keys FROM c" > keys.json
- 用
jq工具合并并去重所有键(需要先安装jq):
jq -r '[.[].keys[]] | unique' keys.json
这样就能得到去重后的完整属性列表。
内容的提问来源于stack exchange,提问作者NSS
相关产品推荐
相关产品推荐

