如何查询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
相关产品推荐
相关产品推荐

