比较操作符有哪些
MongoDB 的比较操作符覆盖范围与集合匹配:$gt、$gte、$lt、$lte 做范围比较,$eq、$ne 做等值判断,$in 与 $nin 按列表匹配。它们的执行代价差别很大——$in 列表通常能走索引,$nin 与 $ne 常常退化为扫描,这是写查询时最先要留意的分界。
基本信息
| 范围 | $gt / $gte / $lt / $lte |
|---|---|
| 列表 | $in / $nin,在数组字段上表示包含任一或不含任何一个 |
| 等值 | $eq / $ne,$ne 通常无法有效利用索引 |
| 跨类型比较 | 先按 BSON 类型顺序比类型,再比同类型内的值 |
| 字段缺失 | $ne 与 $nin 会匹配到字段不存在的文档 |
典型使用场景
- 按数值或时间范围筛选:统计区间内的订单与日志
- 按状态列表筛选:$in 列出若干允许的状态值
- 排除法查询:$nin 过滤黑名单或已完成状态
- 多条件组合:用 $and 或在对象里并列多个操作符
- 配合 $exists 处理字段缺失,避免统计口径偏差
常用写法
常用写法
// 范围组合:数量在 5 到 20 之间
db.orders.find({ qty: { $gt: 5, $lte: 20 } })
// 列表匹配:状态属于若干允许值
db.orders.find({ status: { $in: ["paid", "shipped"] } })
// 排除列表:注意会连带匹配字段缺失的文档
db.orders.find({ sku: { $nin: ["A-1", "A-2"] } })
// 显式排除缺失字段,避免口径偏差
db.orders.find({ sku: { $nin: ["A-1", "A-2"], $exists: true } })
// 数组字段上的比较:任一元素满足即命中
db.posts.find({ scores: { $gte: 90 } })操作符与索引利用
| 操作符 | 语义 | 索引利用 |
|---|---|---|
| $gt / $lte | 范围比较 | 可走索引,配合等值前缀效果更好 |
| $in | 列表内匹配 | 列表较小时通常可利用索引 |
| $nin | 不在列表内 | 通常退化为扫描 |
| $ne | 不等于 | 通常无法有效利用索引 |
| $exists | 字段是否存在 | 与其他条件组合时会影响索引选择 |
跨类型比较会先按 BSON 类型顺序排列再比值:数字与字符串直接比较时结果不是数值大小,数据里混存类型会把范围查询结果带偏。
数组字段上的范围条件表示「任一元素满足即命中」;如果要求同一条元素同时满足多个条件,必须改用 $elemMatch,否则语义完全不同。