一、使用MongoDB
聚合管道(Aggregation Pipeline
)可以實現的功能
- 1、使用聚合管道可以對集合中的文檔進行變換和組合。
- 2、實際項目:表關聯查詢、數據的統計。
二、聚合管道的使用方式
-
1、使用方式
db.collection_name[表名].aggregate([{}, {},....])
-
2、使用的效果展示
三、基本的命令集合
-
1、
mongodb aggregation
管道操作符和表達式No 管道操作符 描素 1 $project
增加、刪除、重命名字段(查詢的字段) 2 $match
條件匹配查詢,只有符和條件的數據才能查詢出來 3 $limit
限制結果的數量 4 $skip
跳過文檔的數量 5 $sort
排序 6 $group
根據條件分組 7 $lookup
用來引入別的集合(多表查詢) 關於
$lookup
的幾個參數介紹NO 字段 描素 1 from
同一個數據庫下等待被 Join
的集合2 localField
源集合中的 match
值,如果輸入的集合中,某文檔沒有localField
這個Key(Field)
,在處理的過程中,會默認爲此文檔含有localField:null
的鍵值對。3 foreignField
待 Join
的集合的match
值,如果待Join
的集合中,文檔沒有foreignField
值,在處理的過程中,會默認爲此文檔含有foreignField:null
的鍵值對。4 as
爲輸出文檔的新增值命名。如果輸入的集合中已存在該值,則會覆蓋掉 -
2、
mongodb
中與mysql
中的對比No mysql
mongodb
描素 1 where
$match
查詢條件 2 group by
$group
分組查詢 3 having
$match
查詢條件 4 order by
$sort
排序 5 limit
$limit
限制 6 sum
$sum
求和 7 count
$sum
計數 8 join
$lookup
表關聯 9 select
$project
選擇字段 -
3、管道表達式
-
管道操作符作爲"鍵",所對應的“值”叫做管道表達式
-
{$match:{status:"A"}},$match
稱爲管道操作符,而status:"A"
稱爲管道表達式, 是管道操作符的操作數(Operand
) -
常見的管道表達式操作符
No 表達式操作符 描素 1 $addToSet
將穩定指定字段的值去重 2 $max
文檔指定字段的最大值 3 $min
文檔指定字段的最小值 4 $sum
文檔指定字段求和 5 $avg
文檔指定字段求平均值 6 $gt
大於給定的值 7 $lt
小於給定的值 8 $eq
等於給定的值 9 gte
大於等於給定的值 10 lte
小於等於給定的值
-
四、數據操作
-
1、登錄數據庫並且創建數據庫
# 登錄數據庫 mongo # 查看全部的數據庫 show dbs # 使用哪個數據庫【如果當前沒這個數據可以就是創建,之前有就是使用。如果是創建必須先插入一條數據使用show dbs纔可以看到】 use 數據庫名 # 查看當前使用的是哪個數據庫 db
-
2、模擬數據插入到
mongodb
中-- 訂單 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})
-
3、
$project
只查詢出想要的字段-- db.order.aggregate([]) db.getCollection('order').aggregate([ { $project: {trade_no:1,all_price:1} -- 表示只查詢出trade_no和all_price字段 } ])
-
4、
$match
過濾數據db.getCollection('order').aggregate([ { $project: {trade_no:1,all_price:1} }, { -- 對上面查詢的結果進行過濾,只查詢出價格大於等於90的 $match: {all_price: {$gte: 90}} } ])
-
5、
$group
分組查詢db.order_item.aggregate([ { -- 根據order_id字段來分組求和,求和字段是$num $group: {_id: "$order_id", total: {$sum: "$num"}} } ])
-
6、
$sort
排序db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { -- -1表示降序,1表示升序 $sort: {all_price: -1} } ])
-
7、
$limit
表示限制返回多少條db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { $sort: {all_price: -1} }, { $limit: 1 } ])
-
8、
$skip
跳過多少條(從多少條數據開始)db.order.aggregate([ { $project: {order_id: 1, all_price: 1} }, { $match: {all_price: {$gte: 90}} }, { $sort: {all_price: -1} }, { $limit: 1 }, { $skip: 1 } ])
-
9、
$lookup
關聯查詢db.order.aggregate([ { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item" } } ])
db.order.aggregate([ { $match: {all_price: {$gte: 90}} }, { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item", } } ])
db.order.aggregate([ { $match: {all_price: {$gte: 90}} }, { $lookup: { from: "order_item", localField: "order_id", foreignField: "order_id", as: "item", } }, { -- 需要顯示的字段 $project: {"all_price": 1, "all_num": 1, "item.title": 1} } ])