阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 表达式与运算符(算术、比较、日期、字符串等)

表达式与运算符(算术、比较、日期、字符串等)

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

表达式与运算符(算术、比较、日期、字符串等)

MongoDB提供了丰富的表达式和运算符,用于在聚合管道、查询条件和更新操作中进行数据处理。这些运算符涵盖了算术运算、比较操作、日期处理、字符串操作等多个方面,能够满足复杂的数据操作需求。

算术运算符

算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法等。在聚合管道中,这些运算符常用于计算字段值或生成新的字段。

// 示例:使用$add计算总价
db.orders.aggregate([
  {
    $project: {
      totalPrice: {
        $add: ["$price", "$tax"]
      }
    }
  }
])

// 示例:使用$multiply计算折扣价
db.products.aggregate([
  {
    $project: {
      discountedPrice: {
        $multiply: ["$price", 0.8]
      }
    }
  }
])

常用算术运算符包括:

  • $add:加法
  • $subtract:减法
  • $multiply:乘法
  • $divide:除法
  • $mod:取模
  • $abs:绝对值
  • $ceil:向上取整
  • $floor:向下取整
  • $round:四舍五入
  • $sqrt:平方根
  • $pow:幂运算

比较运算符

比较运算符用于比较两个值,返回布尔结果。这些运算符在查询条件和聚合表达式中都非常有用。

// 示例:查询价格大于100的产品
db.products.find({
  price: { $gt: 100 }
})

// 示例:在聚合管道中比较日期
db.orders.aggregate([
  {
    $match: {
      $expr: {
        $gt: ["$orderDate", "$dueDate"]
      }
    }
  }
])

主要比较运算符包括:

  • $eq:等于
  • $ne:不等于
  • $gt:大于
  • $gte:大于等于
  • $lt:小于
  • $lte:小于等于
  • $in:在数组中
  • $nin:不在数组中
  • $cmp:比较两个值,返回-1、0或1

日期运算符

MongoDB提供了丰富的日期运算符,用于处理日期字段和进行日期计算。

// 示例:计算订单处理天数
db.orders.aggregate([
  {
    $project: {
      processingDays: {
        $dateDiff: {
          startDate: "$orderDate",
          endDate: "$shipDate",
          unit: "day"
        }
      }
    }
  }
])

// 示例:获取日期的各个部分
db.events.aggregate([
  {
    $project: {
      year: { $year: "$date" },
      month: { $month: "$date" },
      day: { $dayOfMonth: "$date" },
      hour: { $hour: "$date" }
    }
  }
])

常用日期运算符:

  • $dateFromString:将字符串转换为日期
  • $dateToString:将日期格式化为字符串
  • $dayOfYear:获取一年中的第几天
  • $dayOfMonth:获取一月中的第几天
  • $dayOfWeek:获取一周中的第几天
  • $year/$month/$hour等:获取日期各部分
  • $dateAdd:日期加法
  • $dateSubtract:日期减法
  • $dateDiff:计算日期差值

字符串运算符

字符串运算符用于处理文本数据,包括连接、截取、大小写转换等操作。

// 示例:连接姓和名
db.users.aggregate([
  {
    $project: {
      fullName: {
        $concat: ["$firstName", " ", "$lastName"]
      }
    }
  }
])

// 示例:转换大小写
db.products.aggregate([
  {
    $project: {
      nameUpper: { $toUpper: "$name" },
      descriptionLower: { $toLower: "$description" }
    }
  }
])

主要字符串运算符:

  • $concat:连接字符串
  • $substr/$substrBytes/$substrCP:截取子字符串
  • $toLower:转换为小写
  • $toUpper:转换为大写
  • $trim:去除首尾空格
  • $ltrim:去除左侧空格
  • $rtrim:去除右侧空格
  • $split:分割字符串为数组
  • $strLenBytes:字符串字节长度
  • $strLenCP:字符串字符长度
  • $indexOfBytes/$indexOfCP:查找子字符串位置

逻辑运算符

逻辑运算符用于组合多个条件,构建复杂的逻辑表达式。

// 示例:组合多个条件
db.products.find({
  $and: [
    { price: { $gt: 50 } },
    { price: { $lt: 200 } },
    { stock: { $gt: 0 } }
  ]
})

// 示例:在聚合管道中使用条件逻辑
db.orders.aggregate([
  {
    $project: {
      status: {
        $cond: {
          if: { $gte: ["$amount", 1000] },
          then: "VIP",
          else: "Standard"
        }
      }
    }
  }
])

主要逻辑运算符:

  • $and:逻辑与
  • $or:逻辑或
  • $not:逻辑非
  • $nor:逻辑或非
  • $cond:条件表达式
  • $ifNull:如果为null则返回默认值
  • $switch:多条件分支

数组运算符

数组运算符用于处理数组字段,包括查询数组元素、操作数组内容等。

// 示例:查询包含特定标签的产品
db.products.find({
  tags: { $in: ["electronics", "sale"] }
})

// 示例:在聚合管道中操作数组
db.users.aggregate([
  {
    $project: {
      firstSkill: { $arrayElemAt: ["$skills", 0] },
      skillCount: { $size: "$skills" }
    }
  }
])

常用数组运算符:

  • $arrayElemAt:获取数组指定位置的元素
  • $concatArrays:连接多个数组
  • $filter:过滤数组元素
  • $in:判断值是否在数组中
  • $indexOfArray:查找元素在数组中的位置
  • $isArray:判断是否为数组
  • $map:映射数组
  • $range:生成数值范围数组
  • $reduce:归约数组
  • $reverseArray:反转数组
  • $size:获取数组长度
  • $slice:截取数组片段
  • $zip:合并多个数组

条件表达式

条件表达式允许根据条件返回不同的值,类似于编程语言中的if-else语句。

// 示例:根据分数返回等级
db.students.aggregate([
  {
    $project: {
      grade: {
        $switch: {
          branches: [
            { case: { $gte: ["$score", 90] }, then: "A" },
            { case: { $gte: ["$score", 80] }, then: "B" },
            { case: { $gte: ["$score", 70] }, then: "C" },
            { case: { $gte: ["$score", 60] }, then: "D" }
          ],
          default: "F"
        }
      }
    }
  }
])

主要条件表达式:

  • $cond:三元条件表达式
  • $ifNull:处理null值
  • $switch:多分支条件

类型转换运算符

类型转换运算符用于在不同数据类型之间进行转换。

// 示例:将字符串转换为数字
db.products.aggregate([
  {
    $project: {
      priceNumeric: {
        $toDouble: "$price"
      }
    }
  }
])

// 示例:检查字段类型
db.data.aggregate([
  {
    $project: {
      fieldType: {
        $type: "$value"
      }
    }
  }
])

主要类型转换运算符:

  • $convert:通用类型转换
  • $toBool:转换为布尔值
  • $toDate:转换为日期
  • $toDecimal:转换为Decimal128
  • $toDouble:转换为双精度浮点数
  • $toInt:转换为整数
  • $toLong:转换为长整数
  • $toObjectId:转换为ObjectId
  • $toString:转换为字符串
  • $type:获取值的BSON类型

变量与表达式

MongoDB允许在聚合管道中使用变量和复杂的表达式。

// 示例:使用变量计算
db.sales.aggregate([
  {
    $project: {
      total: {
        $let: {
          vars: {
            subtotal: { $multiply: ["$price", "$quantity"] }
          },
          in: {
            $subtract: [
              "$$subtotal",
              { $multiply: ["$$subtotal", "$discount"] }
            ]
          }
        }
      }
    }
  }
])

相关运算符:

  • $let:定义局部变量
  • $literal:返回字面量值,不解析为表达式

聚合累加器

聚合累加器用于在分组操作中计算汇总值。

// 示例:计算销售统计
db.sales.aggregate([
  {
    $group: {
      _id: "$productId",
      totalSales: { $sum: "$amount" },
      averagePrice: { $avg: "$price" },
      count: { $sum: 1 },
      maxQuantity: { $max: "$quantity" },
      minQuantity: { $min: "$quantity" }
    }
  }
])

主要聚合累加器:

  • $sum:求和
  • $avg:平均值
  • $first:获取组内第一个文档的字段值
  • $last:获取组内最后一个文档的字段值
  • $max:最大值
  • $min:最小值
  • $push:将值添加到数组
  • $addToSet:将唯一值添加到集合
  • $stdDevPop:总体标准差
  • $stdDevSamp:样本标准差

地理空间运算符

MongoDB提供了专门的地理空间运算符,用于处理地理空间数据。

// 示例:查询附近的点
db.places.find({
  location: {
    $near: {
      $geometry: {
        type: "Point",
        coordinates: [longitude, latitude]
      },
      $maxDistance: 1000
    }
  }
})

主要地理空间运算符:

  • $geoWithin:查询完全包含在指定几何图形内的文档
  • $geoIntersects:查询与指定几何图形相交的文档
  • $near:查询靠近某个点的文档
  • $nearSphere:在球面上查询靠近某个点的文档
  • $geometry:指定GeoJSON几何图形
  • $center/$centerSphere:指定圆形区域
  • $box/$polygon:指定多边形区域

位运算符

位运算符用于对整数值执行位操作。

// 示例:检查权限位
db.users.aggregate([
  {
    $project: {
      hasWritePermission: {
        $gt: [
          { $bitAnd: ["$permissions", 2] },
          0
        ]
      }
    }
  }
])

主要位运算符:

  • $bitAnd:按位与
  • $bitOr:按位或
  • $bitXor:按位异或
  • $bitNot:按位非

文本搜索运算符

MongoDB提供了全文搜索功能,支持文本索引和搜索。

// 示例:文本搜索
db.articles.find({
  $text: {
    $search: "mongodb tutorial",
    $language: "en",
    $caseSensitive: false
  }
})

相关运算符:

  • $text:执行文本搜索
  • $meta:获取文本搜索的相关性分数
  • $search:指定搜索字符串
  • $language:指定语言
  • $caseSensitive:是否区分大小写
  • $diacriticSensitive:是否区分音调符号

其他特殊运算符

MongoDB还提供了一些特殊用途的运算符。

// 示例:使用$rand生成随机数
db.users.aggregate([
  {
    $project: {
      randomScore: {
        $add: ["$score", { $multiply: [{ $rand: {} }, 10] }]
      }
    }
  }
])

其他特殊运算符:

  • $rand:生成0到1之间的随机数
  • $sampleRate:随机抽样
  • $getField/$setField:动态获取/设置字段
  • $tsIncrement:获取时间戳的增量部分
  • $tsSecond:获取时间戳的秒部分

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

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

前端川

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