1. 聚合操作
db.<collection>.aggregate(<pipeline>,<options>)
<pipeline>
文档定义了操作中使用的聚合管道阶段和聚合操作符
<options>
文档声明了一些聚合操作的参数
介绍几种常见的表达式:
-
字段路径表达式
$<field>
: 使用 $ 来指示字段路径,例如: n a m e 表 示 用 户 名 字 段 ‘ name 表示用户名字段 ` name表示用户名字段‘.` : 使用 $ 和 . 来指示内嵌文档字段路径 -
系统变量表达式
$$<variable>
: 使用 来 指 示 系 统 变 量 ‘ 来指示系统变量 ` 来指示系统变量‘CURRENT: 指示管道中当前操作的文档
$ C U R R E N T . < f i e l d > ‘ 和 ‘ CURRENT.<field>` 和 ` CURRENT.<field>‘和‘` 是等效的 -
常量表达式
$literal: <value>
: 指示常量<value>
$literal: "$name"
: 指示常量字符串 “$name”,这里 $ 被当作常量处理,而不是字段路径表达式
聚合管道阶段
- $project : 对输入的文档进行投影
- $match : 对输入的文档进行过滤筛选
- $limit : 筛选出管道内前N篇文档
- $skip : 跳过管道内前N篇文档
- $unwind : 展开输入文档中的数组字段
- $sort : 对输入的文档进行排序
- $lookup : 对输入的文档进行查询操作
- $group : 对输入的文档进行分组
- $out : 将管道中的文档输出
1.1 $project : 对输入的文档进行投影
$project是一个非常常用的聚合阶段,可以用来灵活地控制输出文档的格式,也可以用来剔除不相关的字段,以优化聚合管道操作的性能。
现在 user 集合的数据:
> db.user.find()
{ "_id" : "1", "money" : 1500, "name" : "刘一一", "gender" : "女" }
{ "_id" : "2", "money" : 1000, "name" : "陈二", "gender" : "女" }
{ "_id" : "3", "name" : "张三", "sal" : 1000, "gender" : "女" }
{ "_id" : "4", "money" : 800, "name" : "李四", "gender" : "女" }
{ "_id" : "5", "money" : 1000, "name" : "王五", "sal" : 500, "gender" : "女" }
{ "_id" : "6", "name" : "赵六", "money" : 1000 }
{ "_id" : "7", "money" : 1000, "name" : "孙七", "gender" : "女" }
{ "_id" : ObjectId("5fff6a78025e5d9ea86e18cc"), "money" : 1000, "name" : "周八", "gender" : "女" }
{ "_id" : { "age" : 18, "gender" : "男" }, "money" : 1000, "name" : "吴九", "gender" : "女" }
{ "_id" : ObjectId("5fff95783f6d5ed2fcce4133"), "money" : 2000, "name" : "ZHANG", "addr" : [ "三亚", "北京" ], "gender" : "女" }
{ "_id" : ObjectId("60045f5719414c7b5be4c122"), "name" : "富二代", "money" : 1500 }
{ "_id" : ObjectId("6004611c19414c7b5be4c13f"), "name" : "打工人", "money" : 800 }
>
只投影name 和 money 字段
> db.user.aggregate([{$project: {_id:0, name: 1, money: 1}}])
{ "money" : 1500, "name" : "刘一一" }
{ "money" : 1000, "name" : "陈二" }
{ "name" : "张三" }
{ "money" : 800, "name" : "李四" }
{ "money" : 1000, "name" : "王五" }
{ "name" : "赵六", "money" : 1000 }
{ "money" : 1000, "name" : "孙七" }
{ "money" : 1000, "name" : "周八" }
{ "money" : 1000, "name" : "吴九" }
{ "money" : 2000, "name" : "ZHANG" }
{ "name" : "富二代", "money" : 1500 }
{ "name" : "打工人", "money" : 800 }
>
在返回结果中对投影的字段设置别名,将 _id 设置别名 “主键”
> db.user.aggregate([{$project: {_id:0, name: 1, money: 1, 主键: "$_id"}}])
{ "money" : 1500, "name" : "刘一一", "主键" : "1" }
{ "money" : 1000, "name" : "陈二", "主键" : "2" }
{ "name" : "张三", "主键" : "3" }
{ "money" : 800, "name" : "李四", "主键" : "4" }
{ "money" : 1000, "name" : "王五", "主键" : "5" }
{ "name" : "赵六", "money" : 1000, "主键" : "6" }
{ "money" : 1000, "name" : "孙七", "主键" : "7" }
{ "money" : 1000, "name" : "周八", "主键" : ObjectId("5fff6a78025e5d9ea86e18cc") }
{ "money" : 1000, "name" : "吴九", "主键" : { "age" : 18, "gender" : "男" } }
{ "money" : 2000, "name"