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

如何查询MongoDB文档内对象的所有子字段,筛选匹配指定年份的球员数据

解决方案

以下两种MongoDB查询方案都不需要提前预定义球队缩写,仅需传入目标年份即可匹配符合条件的球员记录,推荐优先使用方案1。

方案1:$expr + $objectToArray 写法(MongoDB 3.4.4及以上版本支持)

该写法为官方推荐实现,性能更高且无安全风险:

// 可直接修改此处为要查询的目标年份
const targetYear = 2010;
// players替换为你实际的集合名称
db.players.find({
  $expr: {
    $gt: [
      {
        $size: {
          $filter: {
            input: { $objectToArray: "$teams" },
            cond: { $in: [targetYear, "$$this.v"] }
          }
        }
      },
      0
    ]
  }
})

逻辑说明:

  • 用$objectToArray将结构不固定的teams对象转换为键值对数组,每个元素格式为{k: 球队缩写, v: 出战年份数组}
  • 用$filter筛选出所有出战年份数组包含目标年份的键值对元素
  • 只要筛选后的数组长度大于0,就说明该球员符合查询条件

方案2:$where 写法(兼容低版本MongoDB)

如果使用的MongoDB版本低于3.4.4,可以用该写法实现:

// 可直接修改此处为要查询的目标年份
const targetYear = 2010;
// players替换为你实际的集合名称
db.players.find({
  $where: function() {
    for (const teamKey in this.teams) {
      if (this.teams[teamKey].includes(targetYear)) {
        return true;
      }
    }
    return false;
  }
})

注意:$where查询会遍历全表执行自定义函数,性能低于方案1,同时存在注入风险,仅作为降级方案使用。

内容的提问来源于stack exchange,提问作者laneherby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:15:03