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

Azure MongoDB+Synapse Link:字符串列值意外包含JSON结构

问题原因

当使用Azure Synapse的OPENROWSET查询Mongo API的Cosmos DB时,字符串字段返回{"string":"2020-12-14"}这类嵌套结构,核心原因是Mongo API的Cosmos DB基于BSON格式存储数据。在部分场景下(比如特定导入工具、旧版驱动或非标准数据写入流程),字符串会被包装在带BSON类型标识的结构中。Synapse的OPENROWSET默认读取原始的BSON序列化JSON表示,不会自动提取内层的实际值。

解决方案

1. 修正数据存储格式(推荐)

从根源解决问题,确保数据以Mongo原生字符串类型存储:

  • 检查导入工具的配置,避免工具自动添加BSON类型标记(部分JSON导入工具会将字符串包装为{"string": "值"}以兼容特定BSON类型逻辑)。
  • 通过Mongo驱动写入数据时,直接使用原生字符串类型,不要用自定义的类型包装对象。

2. 查询时解析字段

若无法修改存储的数据,可在查询中手动提取字段值:

单个字段解析(你已用到的方法)

SELECT TOP 10 JSON_VALUE([date_rep], '$.string') AS [date_rep]
FROM OPENROWSET(
                PROVIDER = 'CosmosDB',
                CONNECTION = 'Account=analytcstest;Database=ecdc',
                OBJECT = 'ecds',
                SERVER_CREDENTIAL = 'analytcstest'
)  with ( date_rep varchar(200) ) as rows

批量解析所有字段

结合OPENJSON批量展开所有嵌套字段:

SELECT TOP 10
    JSON_VALUE(doc.'$.date_rep', '$.string') AS date_rep,
    JSON_VALUE(doc.'$.country', '$.string') AS country,
    -- 其他字段按此格式依次添加
    JSON_VALUE(doc.'$.cases', '$.number') AS cases
FROM OPENROWSET(
                PROVIDER = 'CosmosDB',
                CONNECTION = 'Account=analytcstest;Database=ecdc',
                OBJECT = 'ecds',
                SERVER_CREDENTIAL = 'analytcstest'
) as rows
CROSS APPLY OPENJSON(rows.BulkColumn) AS doc

3. 配置分析存储类型映射

若启用了Cosmos DB分析存储,可通过调整索引策略确保类型正确映射:

  • 确认分析存储的索引配置中,字符串字段被标记为原生字符串类型,而非嵌套JSON结构。
  • 使用OPENROWSET时,确保连接字符串正确指向分析存储(若单独启用),而非主存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:31:01