阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 查询运算符(比较、逻辑、元素、数组、位运算等)

查询运算符(比较、逻辑、元素、数组、位运算等)

作者:陈川 阅读数:28281人阅读 分类: MongoDB

MongoDB提供了丰富的查询运算符,用于在查询文档时进行各种操作。这些运算符可以分为比较、逻辑、元素、数组和位运算等类型,每种类型都有特定的用途和语法。

比较运算符

比较运算符用于比较字段值与指定值之间的关系。常用的比较运算符包括:

  • $eq:匹配等于指定值的字段
  • $ne:匹配不等于指定值的字段
  • $gt:匹配大于指定值的字段
  • $gte:匹配大于或等于指定值的字段
  • $lt:匹配小于指定值的字段
  • $lte:匹配小于或等于指定值的字段
  • $in:匹配数组中任意一个值的字段
  • $nin:不匹配数组中任意一个值的字段
// 查找年龄大于25的用户
db.users.find({ age: { $gt: 25 } })

// 查找状态为"active"或"pending"的用户
db.users.find({ status: { $in: ["active", "pending"] } })

逻辑运算符

逻辑运算符用于组合多个查询条件,实现复杂的逻辑判断。主要的逻辑运算符有:

  • $and:逻辑与,所有条件都必须满足
  • $or:逻辑或,至少一个条件必须满足
  • $not:逻辑非,反转查询条件
  • $nor:逻辑或非,所有条件都不满足
// 查找年龄大于25且状态为active的用户
db.users.find({ 
  $and: [
    { age: { $gt: 25 } },
    { status: "active" }
  ]
})

// 查找年龄小于20或大于30的用户
db.users.find({
  $or: [
    { age: { $lt: 20 } },
    { age: { $gt: 30 } }
  ]
})

元素运算符

元素运算符用于检查文档中字段的存在性或数据类型:

  • $exists:检查字段是否存在
  • $type:检查字段的BSON类型
// 查找有email字段的用户
db.users.find({ email: { $exists: true } })

// 查找age字段为数字类型的用户
db.users.find({ age: { $type: "number" } })

数组运算符

数组运算符专门用于处理数组字段:

  • $all:匹配包含所有指定元素的数组
  • $elemMatch:匹配数组中至少有一个元素满足所有指定条件
  • $size:匹配指定长度的数组
// 查找skills数组同时包含"JavaScript"和"MongoDB"的用户
db.users.find({ skills: { $all: ["JavaScript", "MongoDB"] } })

// 查找成绩数组中至少有一个大于90且课程为math的记录
db.users.find({
  scores: {
    $elemMatch: {
      score: { $gt: 90 },
      course: "math"
    }
  }
})

位运算符

位运算符用于对整数值进行位操作:

  • $bitsAllSet:匹配所有指定位都设置为1的字段
  • $bitsAnySet:匹配任何指定位设置为1的字段
  • $bitsAllClear:匹配所有指定位都清除为0的字段
  • $bitsAnyClear:匹配任何指定位清除为0的字段
// 查找flags字段的第1位和第3位都设置为1的文档
db.users.find({ flags: { $bitsAllSet: [1, 3] } })

// 查找permissions字段的第2位或第4位设置为1的文档
db.users.find({ permissions: { $bitsAnySet: [2, 4] } })

评估运算符

评估运算符允许在查询中使用JavaScript表达式或其他评估方式:

  • $expr:允许在查询语言中使用聚合表达式
  • $jsonSchema:根据给定的JSON模式验证文档
  • $mod:对字段值执行模运算并匹配结果
  • $regex:提供正则表达式匹配字符串
  • $text:执行文本搜索
// 使用表达式比较两个字段
db.sales.find({
  $expr: {
    $gt: ["$revenue", "$cost"]
  }
})

// 使用正则表达式匹配以"John"开头的名字
db.users.find({ name: { $regex: /^John/ } })

地理空间运算符

MongoDB提供了专门的地理空间查询运算符:

  • $geoWithin:匹配完全包含在指定几何图形内的地理空间数据
  • $geoIntersects:匹配与指定几何图形相交的地理空间数据
  • $near:返回接近指定点的文档,按距离排序
  • $nearSphere:类似$near,但使用球面几何计算距离
// 查找位于指定多边形区域内的地点
db.places.find({
  location: {
    $geoWithin: {
      $geometry: {
        type: "Polygon",
        coordinates: [[[0,0], [3,6], [6,0], [0,0]]]
      }
    }
  }
})

投影运算符

投影运算符用于控制查询返回的字段:

  • $:投影数组中匹配查询条件的第一个元素
  • $elemMatch:投影数组中匹配指定条件的第一个元素
  • $meta:投影文本搜索的分数或其他元数据
  • $slice:限制返回数组元素的数量
// 只返回comments数组中第一个匹配条件的元素
db.posts.find(
  { "comments.author": "John" },
  { "comments.$": 1 }
)

// 返回scores数组的前3个元素
db.students.find(
  {},
  { scores: { $slice: 3 } }
)

更新运算符

虽然主要用于更新操作,但这些运算符在查询上下文中也有特殊用途:

  • $:充当占位符,更新与查询条件匹配的第一个数组元素
  • $[]:充当占位符,更新所有匹配查询条件的数组元素
  • $[<identifier>]:与arrayFilters一起使用,更新匹配arrayFilters条件的数组元素
// 更新第一个状态为"pending"的订单
db.orders.update(
  { "items.status": "pending" },
  { $set: { "items.$.status": "processing" } }
)

聚合管道运算符

在聚合管道中使用的特殊查询运算符:

  • $match:过滤文档,类似于find()
  • $lookup:执行左外连接
  • $graphLookup:执行递归搜索
  • $redact:基于字段值限制文档内容
// 在聚合管道中使用$match
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$customer", total: { $sum: "$amount" } } }
])

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌