首页/数据/NoSQL 速查/比较操作符 $gt / $lte / $in / $nin
MongoDB99 条

比较操作符 $gt / $lte / $in / $nin

范围比较 $gt $gte $lt $lte、等值 $eq $ne、列表匹配 $in/$nin;$in 列表可走索引,$nin 通常全表扫描。

NoSQL 速查数据更新于 2026-10-13

比较操作符有哪些

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,否则语义完全不同。

易错点

  • $nin 与 $ne 都会匹配字段缺失的文档,过滤空值时必须配合 $exists,否则结果比预期多出一批
  • 把 $nin 用在很长的不匹配列表上并在大集合上执行,会退化为集合扫描,接口延迟随数据量上升
  • 字段类型混存(数字与字符串)时直接做范围比较,结果按类型顺序而非数值大小排列,统计口径会出错
  • 在数组字段上并列多个比较条件,误以为要求同一元素满足,实际是不同元素各自满足即可,需要改成 $elemMatch

数据来源与参考

  • MongoDB Manual: Comparison Query Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌