MongoDB聚合管道
管道操作符
- $project 增加、删除、重命名字段 (可以筛选指定的字段出现)
- $match 条件匹配,只有满足条件的文档才能进入下一个阶段
- $limit 限制结果的数量
- $skip 跳过文档的数量
- $sort 条件排序
- $group 条件组合结果
- $lookup 可以引入其他集合的数据
插入数据
-
db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6}) db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1}) db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1}) db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})
$project
-
db.order.aggregate([ { $project: {order_id: 1, trade_no: 1, all_price: 1} } ])
- 从order文档中筛选所有数据,只需要 order_id trade_no all_price 字段的数据
$match
-
db.order.aggregate([ { $project: {order_id: 1, trade_no: 1, all_price: 1} }, { $match: {"all_price": {$gte: 90}} } ])
- 查找 all_price 大于等于 90 的所有数据
$group
-
db.order_item.aggregate([ { $group: {_id: "$order_id", total: {$sum: "$num"}} } ])
- 以 order_id 字段的取值进行分组,并生成一个 total 字段取值是每个分组的 num 字段累加的值
$limit
-
db.order_item.aggregate([ { $sort: {"price": -1} } ])
- 以 price 字段的值降序排列
$limit
-
db.order.aggregate([ { $sort: {"all_price": -1} }, { $limit: 1 } ])
- 以 all_price 字段进行降序排列并返回一条数据
$skip
-
db.order.aggregate([ { $skip: 1 } ])
- 跳过一条数据显示
$lookup
-
db.order.aggregate([ { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "items" } } ])
- form 关联的表
- foreignField 关联的字段
- localField 当前文档的字段
- as 生成的字段
-
db.order.aggregate([ { $lookup: { // 关联查询 from: "order_item", // 关联文档 foreignField: "order_id", // 关联文档的字段 localField: "order_id", // oder 文档的字段 as: "items", // 匹配的结果放到 items 字段中 } }, { $project: { // 只保留以下字段 trade_no: 1, all_price: 1, items: 1 } }, { $match: { // 满足条件 "all_price": {$gte: 90} // 大于等于 90 } }, { $sort: { // 排序 "all_price": -1, // -1 降序 (1 升序) } } ])

浙公网安备 33010602011771号