MongoDB 提供了丰富的聚合操作符,用于对数据进行复杂的查询、过滤、分组、排序和其他转换操作。以下是一些常用的聚合操作符,按类别进行分类:
1. 管道阶段(Pipeline Stages)
这些操作符用于在聚合管道中创建不同的阶段,每个阶段接收输入并进行处理,然后将结果传递给下一个阶段。
$match
:筛选文档,只返回满足条件的文档,类似于SQL中的WHERE
。$project
:修改输入文档的结构,主要用于包含、排除字段或添加计算字段。$group
:根据指定的字段进行分组,可以执行聚合操作(如计数、求和等)。$sort
:对文档进行排序。$limit
:限制返回的文档数量。$skip
:跳过指定数量的文档。$unwind
:将数组类型的字段拆分为多个文档。$lookup
:进行左外连接,类似于SQL中的JOIN
。$out
:将聚合结果输出到一个新集合。$addFields
:添加新的字段到输出文档中。$replaceRoot
:替换输入文档为指定的文档。$count
:返回文档总数。$facet
:并行执行多条聚合管道,并将结果合并到一个单一的文档中。$bucket
:将文档分组到指定范围的桶中。$bucketAuto
:根据输入数据的分布自动生成桶。$sortByCount
:根据字段值的计数进行排序。
2. 聚合表达式(Aggregation Expressions)
这些操作符用于在管道阶段中执行计算和操作。
数学运算符
$add
:加法。$subtract
:减法。$multiply
:乘法。$divide
:除法。$mod
:取模运算。
字符串操作符
$concat
:字符串连接。$substr
:截取子字符串。$toLower
:转换为小写。$toUpper
:转换为大写。$strcasecmp
:字符串不区分大小写的比较。
数组操作符
$arrayElemAt
:返回指定位置的数组元素。$concatArrays
:连接两个或多个数组。$filter
:筛选数组元素。$size
:返回数组的长度。$slice
:截取数组的一部分。
日期操作符
$dateFromString
:将字符串转换为日期。$dateToString
:将日期转换为字符串。$dayOfMonth
:返回日期的天部分。$month
:返回日期的月部分。$year
:返回日期的年部分。$hour
:返回日期的小时部分。$minute
:返回日期的分钟部分。$second
:返回日期的秒部分。
条件和布尔操作符
$cond
:条件判断,类似于三元运算符。$ifNull
:如果为null
,则返回指定值。$and
、$or
、$not
:逻辑运算符。
类型操作符
$type
:返回字段的类型。$convert
:转换字段的类型。
示例
假设有一个集合orders
,其中包含如下文档:
{ "_id": 1, "item": "apple", "quantity": 10, "price": 2.5, "orderDate": ISODate("2023-01-15") }
{ "_id": 2, "item": "banana", "quantity": 5, "price": 1.0, "orderDate": ISODate("2023-02-20") }
{ "_id": 3, "item": "cherry", "quantity": 15, "price": 3.0, "orderDate": ISODate("2023-03-10") }
你可以使用聚合操作符进行复杂查询,例如计算每种商品的总销售额:
db.orders.aggregate([
{
$group: {
_id: "$item",
totalSales: { $sum: { $multiply: ["$quantity", "$price"] } }
}
},
{ $sort: { totalSales: -1 } }
])
这个聚合管道首先按item
字段分组,计算每种商品的总销售额,然后按总销售额降序排序。
这些聚合操作符和表达式使MongoDB能够执行复杂的数据操作和分析,满足各种业务需求。