$nin(不在数组中)
最后更新:2026-10-09
$nin(不在数组中)
$nin 选择字段值不等于给定数组中任何一个值的文档,是 $in 的否定形式。`{ age: { $nin: [18, 21] } }` 匹配年龄既不是 18 也不是 21 的用户。注意两点:与 $ne 类似,不匹配字段缺失的文档;对数组字段,只要任一元素不在给定数组中即匹配。
| 分类 | 比较 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ <字段>: { $nin: [ <值1>, <值2>, ... ] } }
⚙️ 参数
| 字段 | 要匹配的文档字段名。 |
|---|---|
| 值数组 | 要排除的值列表,字段值不等于其中任何一个。 |
返回值:匹配的文档游标
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $nin:排除年龄 18 和 21 的用户
db.users.find({ age: { $nin: [18, 21] } })
// 字段缺失的文档不会被返回
db.users.find({ age: { $nin: [18] } })
运行结果:
// 返回 age 既不是 18 也不是 21 的用户;字段缺失的用户不返回
📌 注意事项
- 不匹配字段缺失的文档:想包含缺失字段需组合 $exists
- 对数组字段:任一元素不在给定数组即匹配(与 $in 的否定语义一致)
- 排除少量值用 $ne,排除一组值用 $nin 更简洁
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$nin 和 $ne 有什么区别?
A$ne 只排除单个值,$nin 排除一组值;语义都是「不等于」,$nin 是 $ne 的批量形式。
Q$nin 会返回字段不存在的文档吗?
A不会。与 $ne 一样,$nin 只匹配字段存在且值不在数组中的文档。
Q$nin 对数组字段怎么匹配?
A只要数组中有一个元素不在给定数组内即匹配,注意与「整个数组不在其中」不同。