表达式与运算符(算术、比较、日期、字符串等)
表达式与运算符(算术、比较、日期、字符串等)
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