MongoDB查询prizes字段含2个嵌入式文档的诺奖得主方法
筛选恰好获得两次诺贝尔奖得主的MongoDB实现
要实现这个筛选需求,本质是匹配文档中prizes嵌入式数组的长度恰好为2(数组中每一个元素对应一次诺贝尔奖获奖记录),可参考以下实现方案,同时避开常见的写法误区。
可直接使用的查询语句
通用单条find查询
所有支持$size数组操作符的MongoDB版本都可以直接运行,无额外性能损耗:
db.laureate.find({ prizes: { $size: 2 } })
说明:
$size操作符会严格匹配数组的实际元素个数,仅会返回数组长度等于2的文档,不会误匹配数组长度大于2的获奖记录,完全满足“恰好两次获奖”的筛选要求。
低版本兼容的聚合实现
如果使用的MongoDB版本对直接匹配数组大小存在限制,可通过聚合管道完成相同逻辑:
db.laureate.aggregate([ // 计算prizes数组的元素个数,存入临时字段 { $addFields: { prize_total: { $size: "$prizes" } } }, // 筛选获奖次数恰好为2的文档 { $match: { prize_total: 2 } }, // 移除临时字段,保持返回文档结构与原结构一致 { $project: { prize_total: 0 } } ])
常见写法误区
- 不要使用
{prizes: {$all: [{$elemMatch:{}}, {$elemMatch:{}}]}的写法:该逻辑仅会校验数组中是否存在至少2个元素,长度大于2的获奖记录也会被误命中,无法实现“恰好两次”的筛选要求。 - 不要使用
$where写脚本式判断:这类写法无法利用数据库索引,在数据量较大时查询性能会出现明显下降。
运行上述正确的查询语句后,返回的结果会恰好包含玛丽·居里、莱纳斯·鲍林两位符合条件的得主,和预期结果一致。
内容的提问来源于stack exchange,提问作者SosaAlmighty
相关产品推荐
相关产品推荐

