如何查询嵌套数组结构MongoDB文档中SID=100的所有元素
MongoDB多层嵌套数组查询SID=100元素方案
文档结构说明
你给出的示例存在JSON语法问题(US未加引号、多余逗号),合法的存储结构参考如下:
{ "_id": "123456", "Continent": { "Country": [ [ "US", { "State": [ [ 100, { "Product": "Corn", "SID": 100 } ], [ 200, { "Product": "Maze", "SID": 200 } ] ] } ] ] } }
该结构存在两层二维嵌套数组:Continent.Country是二维数组,其内部子数组的第二个元素携带State字段;State同样是二维数组,子数组第二个元素存储带SID属性的业务对象。
方案1:匹配包含目标元素的文档
如果只需要筛选出存在SID=100元素的文档,不需要剔除无关嵌套内容,可以直接用多层$elemMatch做嵌套查询:
db.你的集合名称.find({ "Continent.Country": { $elemMatch: { $elemMatch: { "State": { $elemMatch: { $elemMatch: { "SID": 100 } } } } } } })
该语句会返回整个匹配的文档,不会过滤数组中SID不等于100的其他元素。
方案2:精准提取所有SID=100的元素
如果需要只返回符合条件的SID元素,剔除所有无关嵌套内容,必须用聚合管道,通过逐层展开数组+过滤的方式实现,兼容性覆盖MongoDB 3.2及以上版本:
db.你的集合名称.aggregate([ // 逐层展开第一层二维数组Country { $unwind: "$Continent.Country" }, { $unwind: "$Continent.Country" }, // 过滤掉Country子数组里的非对象元素(比如示例里的"US"字符串) { $match: { "Continent.Country.State": { $exists: true } } }, // 逐层展开第二层二维数组State { $unwind: "$Continent.Country.State" }, { $unwind: "$Continent.Country.State" }, // 过滤出SID=100的目标元素 { $match: { "Continent.Country.State.SID": 100 } }, // 可选:自定义返回字段,这里直接返回匹配到的业务对象 { $project: { _id: 0, targetProduct: "$Continent.Country.State" } } ])
针对给出的示例文档,该语句返回结果如下:
{ "targetProduct": { "Product": "Corn", "SID": 100 } }
注意事项
- 存储文档时请严格遵守JSON语法,字符串类型值必须加双引号,避免出现语法解析错误。
- 如果后续嵌套数组层级增加,只需要对应增加
$unwind展开步骤即可,逻辑保持一致。 - 不推荐用
$where写JS函数遍历,性能远低于聚合管道的原生查询。
内容的提问来源于stack exchange,提问作者abra10834
相关产品推荐
相关产品推荐

