如何在MongoDB嵌套查询中使用*通配符匹配字段?
MongoDB 字段通配符查询实现方案
MongoDB 原生查询语法不支持直接使用 * 作为字段名的通配符,因此你写的{ "info.*.name":"a"}无法直接执行。要实现匹配info下任意子对象的name字段等于a的需求,可采用以下两种方案:
方案一:使用聚合管道查询
通过聚合操作将info对象转换为键值对数组,再筛选符合条件的文档:
db.collection.aggregate([ // 将info对象转为键值对数组,结构为[{k: "123", v: {name: "a"}}, ...] { $addFields: { infoArray: { $objectToArray: "$info" } } }, // 匹配数组中存在v.name等于"a"的文档 { $match: { "infoArray.v.name": "a" } }, // 移除临时添加的infoArray字段,返回原文档结构 { $project: { infoArray: 0 } } ])
方案二:调整数据结构(推荐)
动态字段名(如123、1234这类无意义键)会增加查询和维护成本,更合理的结构是将info改为数组,把动态键作为字段值存储:
{ id: "1", name: "abc", info: [ { key: "123", name: "a" }, { key: "1234", name: "a" } ] }
调整后,直接用简单查询即可匹配目标文档:
db.collection.find({ "info.name": "a" })
内容的提问来源于stack exchange,提问作者Prashant Angrish
相关产品推荐
相关产品推荐

