什么是聚合操作
- 聚合操作就是通过一个方法完成一系列的操作
- 在聚合操作中, 每一个操作我们称之为一个阶段
- 聚合操作会将上一个阶段处理结果传给下一个阶段继续处理
- 所有阶段都处理完毕会返回一个新的结果集给我们
聚合操作格式
db.<collection>.aggregate(<pipeline>, <options>)
-
<pipeline>
: 定义每个阶段操作 -
<options>
: 聚合操作额外配置
聚合管道阶段
可以利用,
$project
对输入文档进行再次投影
- 作用: 按照我们需要的格式生成结果集
- 格式:
{$project:{<field>:<value>}}
好了介绍了这么多我们来看示例吧,首先添加测试数据如下:
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
来填充
db.person.aggregate([
{
$project:{
_id:0,
fullName: ['$name.firstName', '$name.middleName','$name.lastName'],
clientAge: '$age'
}
}
]);