什么是聚合操作

  • 聚合操作就是通过一个方法完成一系列的操作
  • 在聚合操作中, 每一个操作我们称之为一个阶段
  • 聚合操作会将上一个阶段处理结果传给下一个阶段继续处理
  • 所有阶段都处理完毕会返回一个新的结果集给我们

聚合操作格式

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'
}
}
]);

MongoDB-聚合操作$project_路径表达式