如何在MongoDB中查询数组内包含指定属性的对象?
MongoDB查询数组中包含指定属性的对象
嘿,我来帮你搞定这个MongoDB数组查询的问题!针对你存储足球赛事赛程的集合,我分两种常见场景给你讲解具体的查询方法:
场景1:查找包含符合条件比赛的周文档
如果你想找出所有至少有一场比赛满足指定属性条件的比赛周文档,可以直接通过数组元素的属性路径来查询:
示例1:查询存在指定属性的比赛的周
比如要找所有包含有arbitro(裁判)属性的比赛的周:
db.yourCollectionName.find({ "games.arbitro": { $exists: true } })
这里"games.arbitro"直接定位到数组内对象的属性,$exists: true表示该属性存在,MongoDB会自动匹配数组中至少有一个元素满足条件的文档。
示例2:查询属性值符合特定要求的比赛的周
比如要找所有包含裁判为"M"的比赛的周:
db.yourCollectionName.find({ "games.arbitro": "M" })
示例3:多属性组合查询
如果需要同时满足多个属性条件(比如指定球场+指定裁判),可以用$elemMatch确保同一个数组元素满足所有条件:
db.yourCollectionName.find({ "games": { $elemMatch: { estadio: "G C", arbitro: "M" } } })
场景2:返回文档时仅保留符合条件的比赛对象
如果不仅要筛选出符合条件的周,还希望返回结果里只保留数组中满足条件的比赛(而不是整个games数组),可以用以下两种方法:
方法1:用$elemMatch投影(仅返回第一个匹配元素)
这种方法适合只需要数组中第一个符合条件的元素的场景:
db.yourCollectionName.find( { "games.arbitro": "M" }, // 先过滤出符合条件的周 { "games": { $elemMatch: { arbitro: "M" } }, number: 1 } // 投影只保留匹配的比赛和周数 )
方法2:用聚合管道的$filter(返回所有匹配元素)
如果需要返回数组中所有符合条件的元素,聚合管道的$filter是更灵活的选择:
db.yourCollectionName.aggregate([ // 第一步:过滤出包含符合条件比赛的周 { $match: { "games.arbitro": "M" } }, // 第二步:对games数组进行过滤,只保留裁判为"M"的比赛 { $addFields: { filteredGames: { $filter: { input: "$games", as: "game", cond: { $eq: ["$$game.arbitro", "M"] } } } } }, // 可选:替换原来的games字段,只保留需要的字段 { $project: { number: 1, games: "$filteredGames", _id: 0 } } ])
如果只是要筛选存在指定属性的比赛,把cond里的$eq换成$exists即可:
cond: { $exists: ["$$game.arbitro", true] }
内容的提问来源于stack exchange,提问作者Iván
相关产品推荐
相关产品推荐

