XDevAPI如何实现通配符后JSON数组多字段组合匹配查询
问题背景
存储在集合中的JSON文档结构如下:
{ "_id": "12345", "identifier": [ { "value": "1", "system": "system1", "text": "text!" }, { "value": "2", "system": "system1" } ] }
需要使用XDevAPI的SearchConditionStr语法,筛选出identifier数组中存在元素同时匹配指定value、system组合的记录。
此前编写的查询语句无法返回预期结果:
collection.find("'${identifier.value}' IN identifier[*].value && '${identifier.system} IN identifier[*].system")
问题根因
原有查询的两个判断条件相互独立,仅分别校验「数组中存在任意元素value匹配目标值」、「数组中存在任意元素system匹配目标值」,不要求两个条件命中同一个数组元素,会出现跨元素匹配的误判。
例如某文档的identifier值为[{value:"1", system:"sys2"}, {value:"2", system:"sys1"}],当查找value=2、system=sys2的记录时,原有语句会错误返回该文档,但数组内实际没有元素同时满足两个属性要求。
此外直接通过字符串拼接传入查询参数存在注入风险,不推荐使用。
正确写法
使用JSON_CONTAINS函数做数组子集匹配,可精准校验数组内是否存在元素同时满足两个属性条件,配合参数绑定传参规避注入风险,示例代码如下:
// 替换为实际需要匹配的目标值 const matchValue = "1" const matchSystem = "system1" collection.find("JSON_CONTAINS(identifier, :matchItem)") .bind("matchItem", { value: matchValue, system: matchSystem })
该写法的匹配规则为:只要identifier数组中存在任意元素包含传入的value、system键值对即可命中,元素上的其他额外字段(比如示例中的text字段)不会对匹配结果造成影响,完全符合同元素多属性匹配的需求。
内容的提问来源于stack exchange,提问作者Beau Berger
相关产品推荐
相关产品推荐

