什么是聚合操作
- 聚合操作就是通过一个方法完成一系列的操作
- 在聚合操作中, 每一个操作我们称之为一个阶段
- 聚合操作会将上一个阶段处理结果传给下一个阶段继续处理
- 所有阶段都处理完毕会返回一个新的结果集给我们
聚合操作格式
db.<collection>.aggregate(<pipeline>, <options>)
<pipeline>
: 定义每个阶段操作<options>
: 聚合操作额外配置
聚合管道阶段
可以利用,
$project
对输入文档进行再次投影
- 作用: 按照我们需要的格式生成结果集
- 格式:
{$project:{:}}
好了介绍了这么多我们来看示例吧,首先添加测试数据如下:
db.person.insert([ {name:{firstName:'Jonathan', lastName:'Lee'}, age:18, book:{name:'玩转HTML', price: 88}}, {name:{firstName:'Amelie', lastName:'BNTang'}, age:17, book:{name:'玩转JavaScript', price: 99}} ]); db.person.find();
关于 @project:
db.person.aggregate([ { $project:{ _id:0, clientName: '$name.firstName', clientAge: '$age' } } ]);
聚合表达式
字段路径表达式
$<filed>
: 使用$
来指示字段路径$<filed>.<sub-field>
: 使用$
和.
来指示内嵌文档字段路径
字段路径表达式示例
- $name
- $book.name
注意点
$project 修改的是结果集而不是原有的集合
db.person.aggregate([ { $project:{ _id:0, myName: '$name.lastName' } } ]); db.person.find();
如果在 @project 聚合操作中使用了原有文档不存在的字段, 那么会自动用 Null
来填充
_id: 0
的含义就是说 _id 这个字段不展示,可以告诉它那些字段需要显示那些字段不需要显示
db.person.aggregate([ { $project:{ _id:0, fullName: ['$name.firstName', '$name.middleName','$name.lastName'], clientAge: '$age' } } ]);