如何根据trigger.value中的嵌套字段值从集合查询对应document
筛选嵌套JSON字符串字段的查询方案
以下方案基于MongoDB数据库场景给出:
你当前文档结构中trigger.value为JSON字符串类型,无法直接用嵌套对象的点路径语法筛选,可按需选择以下三种实现方式:
1. 内置JSON解析查询(推荐,MongoDB 4.2及以上版本支持)
通过$expr搭配$jsonParse将字符串转为JSON对象后,匹配对应字段值即可,示例语句(筛选brand为A、storageId为2的文档):
db.yourCollectionName.find({ $expr: { $and: [ { $eq: [ { $getField: { input: { $jsonParse: "$trigger.value" }, field: "brand" } }, "A" ] }, { $eq: [ { $getField: { input: { $jsonParse: "$trigger.value" }, field: "storageId" } }, "2" ] } ] } })
注意:该方法需要对每条扫描到的文档做JSON解析,数据量极大的场景下会有性能损耗。
2. 正则匹配查询(不推荐,仅做临时应急)
如果MongoDB版本过低不支持$jsonParse,可以通过正则严格匹配JSON字符串中的键值对实现筛选:
db.yourCollectionName.find({ "trigger.value": { $all: [ /"brand":"A"/, /"storageId":"2"/ ] } })
风险:如果JSON字符串内存在空格、键值顺序变动、或者其他字段包含相同字符串片段,会出现误匹配的问题。
3. 优化数据结构(长期高频使用最优方案)
如果这类查询是业务高频需求,建议写入数据时直接把trigger.value解析为内嵌对象存储,调整后的结构如下:
{ "_id": "60aee243fff5082ca6fba951", "status": "Good", "trigger": { "value": { "brand": "A", "storageId": "2", "emplId": "3" } } }
调整后直接用普通嵌套字段查询即可,性能最高:
db.yourCollectionName.find({ "trigger.value.brand": "A", "trigger.value.storageId": "2" })
内容的提问来源于stack exchange,提问作者Artem Manko
相关产品推荐
相关产品推荐

