WSO2 Data Service插入MongoDB嵌套对象失败求助
解决WSO2 Data Service向MongoDB插入嵌套字段的问题
问题分析
当前查询表达式错误使用clusterDetails.provisioned这类点分隔键名定义MongoDB嵌套文档,同时参数绑定未正确对应嵌套字段路径,导致WSO2 DS无法解析负载中的嵌套值。
修正后的查询配置
重构MongoDB插入表达式的JSON结构,采用嵌套对象语法,同时调整参数引用逻辑,确保嵌套字段能被正确读取:
<query id="mongo_insert" useConfig="fetchmongo"> <expression>device_attributes.insert({ "deviceId": ?, "vin": ?, "clusterDetails": { "provisioned": ?, "sbEndpoint": ?, "clusterName": ?, "clusterId": ?, "nbEndpoint": ?, "kubeMaster": ?, "status": ? } })</expression> <param name="deviceId" sqlType="INTEGER"/> <param name="vin" sqlType="STRING"/> <param name="provisioned" sqlType="STRING"/> <param name="sbEndpoint" sqlType="STRING"/> <param name="clusterName" sqlType="STRING"/> <param name="clusterId" sqlType="STRING"/> <param name="nbEndpoint" sqlType="STRING"/> <param name="kubeMaster" sqlType="STRING"/> <param name="status" sqlType="STRING"/> </query>
关键修正点
- 将点分隔键名改为
"clusterDetails": {...}嵌套对象结构,匹配MongoDB文档格式要求。 - 表达式参数占位符统一使用
?(WSO2 DS对MongoDB的标准参数绑定占位符,兼容性更强)。
负载传递适配方案
方案1:扁平化负载(直接映射参数)
不管JSON还是XML负载,直接将嵌套字段拆平传递,示例JSON负载:
{ "deviceId": 11111, "vin": "WRTHRKSHS0000011", "provisioned": "N", "sbEndpoint": "192.168.22.22", "clusterName": "clustertwo", "clusterId": "cluster11", "nbEndpoint": "192.168.22.22", "kubeMaster": "192.168.22.22", "status": "D" }
方案2:保留嵌套结构(配置路径映射)
如果要保留原嵌套负载结构,需为嵌套字段的参数配置路径映射(以XML负载为例):
<param name="provisioned" sqlType="STRING" paramValueType="PATH" xpath="/root/clusterDetails/provisioned"/> <param name="sbEndpoint" sqlType="STRING" paramValueType="PATH" xpath="/root/clusterDetails/sbEndpoint"/> <!-- 其他嵌套字段参数同理配置xpath -->
配置后WSO2 DS即可从XML的clusterDetails节点下读取对应字段值。
内容的提问来源于stack exchange,提问作者Niranjan Vasadi
相关产品推荐
相关产品推荐

