$elemMatch(数组元素匹配)
最后更新:2026-10-09
$elemMatch(数组元素匹配)
$elemMatch 匹配数组中至少一个元素完整满足给定条件的文档。`{ scores: { $elemMatch: { $gt: 80, $lt: 90 } } }` 要求存在一个分数同时大于 80 且小于 90。若不用 $elemMatch 直接写多个条件,会退化成「不同元素各满足一个条件」,这是数组查询最常见的坑。
| 分类 | 数组 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ <字段>: { $elemMatch: { <条件1>, <条件2>, ... } } }
⚙️ 参数
| 字段 | 要匹配的数组字段名。 |
|---|---|
| 条件 | 元素必须同时满足的查询条件。 |
返回值:匹配的文档游标
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $elemMatch:存在一个分数在 80 到 90 之间
// 同一个元素要同时满足两个条件
db.students.find({ scores: { $elemMatch: { $gt: 80, $lt: 90 } } })
// 对比错误写法:可能匹配不同元素
// db.students.find({ scores: { $gt: 80, $lt: 90 } })
运行结果:
// 返回存在一个分数同时大于 80 且小于 90 的学生文档
📌 注意事项
- 多条件必须同一元素同时满足,这是 $elemMatch 的核心语义
- 数组元素为嵌套文档时也用它:{ $elemMatch: { name: 'A', score: { $gt: 90 } } }
- 单条件时与直接写等价,多条件时不可省略
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$elemMatch 和直接写数组条件有什么区别?
A直接写 { $gt: 80, $lt: 90 } 可能让不同元素各满足一个条件;$elemMatch 要求同一元素同时满足。
Q$elemMatch 能查嵌套文档数组吗?
A能,条件里写嵌套字段,如 { $elemMatch: { type: 'exam', score: { $gte: 90 } } }。
Q$elemMatch 只能用在一个字段上吗?
A是,它针对单个数组字段;多个数组字段各用各的 $elemMatch 即可。