aggregate聚合管道

aggregate聚合管道

九月 16, 2018

一、管道操作符与表达式

fu
管道操作符作为“键”,所对应的“值”叫做管道表达式。例如

1
{$match:{status:"A"}}

$match 称为管道操作符,而 status:”A” 称为管道表达式,是管道操作符的操作数(Operand)。每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。
shi

二、在MongoDB中使用聚合管道

使用聚合管道可以对集合中的文档进行变换和组合。在实际项目中聚合管道多用于表关联查询和数据的统计。在 MongoDB 中使用 db.集合名.aggregate([{ },…]) 的方法来构建和使用聚合管道。下图为官网给出的实例:
agg

三、mongoose aggregate多表关联查询

mongoose 里聚合管道的语法与 MongoDB 中相似。以淘宝订单与订单详情为例,为了将订单表与订单物品关联起来,先在 model 里封装好 order.js 与 order_item.js,然后只将 order model 引入主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var OrderModel=require('./model/order.js');

OrderModel.aggregate([{

$lookup:
{
from: "order_item",
localField: "order_id",
foreignField: "order_id", //通过order_id关联起来
as: "items"
}
},
{
$match: { "all_price": { $gte: 90 } } //筛选总价大于90的
}
], function (err, docs) {

if (err) {
console.log(err)
return;
}
console.log(JSON.stringify(docs))
})
//然后 node .\app.js 终端运行

通过以上示例我们实现了两个表之间的关联查询,由于管道并没有数量限制,因此我们可以通过同样的方式实现多个表之间的关联查询。如下图所示,如果我们想查询文章信息,同时显示文章的分类以及作者信息,就需要使用聚合管道将这三个表关联起来。
duo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var ArticleModel=require('./model/article.js');  //查哪个表就引入哪个表

ArticleModel.aggregate([{

$lookup: {
from: "articlecate",
localField: "cid", //分类表的_id对应文章表的cid
foreignField: "_id",
as: "cate"
}
},
{

$lookup: {
from: "user",
localField: "author_id", //作者表的_id对应文章表的author_id
foreignField: "_id",
as: "user"
}
}

], function (err, docs) {

console.log(JSON.stringify(docs));
})