You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:00:38