-
關系型數據庫表與表的幾種關系
1、一對一的關系
例如:一個人對應一個身份證號,即為一對一的關系
2、一對多的關系
例如:1個班級對應多名學生,即為一對多的關系
3、多對多的關系
例如:一個學生可以選擇多門課程、一門課程可以被多個學生選修,彼此的對應關系,即是多對多的關系。
多對多的通常會建立一個中間表來存儲多對多的關系
聚合管道:
aggregation
db.order.aggregate([ {$match:{state:"A"}},//匹配order表中state為A的數據 {$group:{_id:"$cus_id",total:{$sum:"$amount"}}},//根據cus_id來分組,用每一組的amount來求和 ])
表的聚合管道主要用來做表的關聯查詢和數據統計
聚合管道的常見操作符:
$project : 增加、刪除、重命名字段
$match : 條件匹配,只滿足條件的文檔才能進入下一階段
$limit : 限制結果的數量
$skip : 跳過文檔的數量
$sort : 條件排序
$group : 條件組合結果 統計
$lookup : $lookup可以引入其他集合的數據 (表關聯查詢)
order表中有這些數據
order_item表中有這些數據
一個訂單對應多個商品
$project 篩選列 控制顯示列中的那些字段
db.order.aggregate([ { $project:{order_id:1,trade_no:1,all_price:1} //篩選出order_id、trade_no、all_price 這3個屬性 1|true:顯示 0|false:不顯示 } ])
$match 用於過濾文檔,用法類似於find方法的參數
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進行分組 求出每組num屬性的和 } ])
$sort
對集合中的文檔進行排序
db.order.aggregate([ { $project:{order_id:1,trade_no:1,all_price:1} }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} //以all_price進行倒敘排序 1:正序 2:倒敘 } ])
$limit
限制文檔條數
db.order.aggregate([ { $project:{order_id:1,trade_no:1,all_price:1} }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} }, { $limit:1 //限制1條 } ])
$skip
跳過幾條
db.order.aggregate([ { $project:{order_id:1,trade_no:1,all_price:1} }, { $match:{"all_price":{$gte:90}} }, { $sort:{"all_price":-1} }, { $limit:2 }, { $skip:1 //跳過1條 } ])
$lookup
表關聯
實現下面結果
[ { order_id:'', trade_no:'', items:[ {title:'鼠標',price:20}, {title:'鍵盤',price:20} ] } ]
分析trade_no在order表內 剩余屬性在order_item表內都有
db.order.aggregate([ { $lookup:{ from:"order_item",//order要關聯order_item表 localField:"order_id",//要關聯的字段 order表本身的 order_id 字段 foreignField:"order_id",//要關聯的字段 關聯表的 order_id 字段 as:"items" //把關聯表的數據放到items中 } } ])
結果
{ "_id": ObjectId("612b399436239d3a8307cfdb"), "order_id": "1", "uid": 10, "trade_no": "111", "all_price": 100, "all_num": 2, "items": [{ "_id": ObjectId("612b399436239d3a8307cfde"), "order_id": "1", "title": "商品鼠標1", "price": 50, "num": 1 }, { "_id": ObjectId("612b399436239d3a8307cfdf"), "order_id": "1", "title": "商品鍵盤2", "price": 50, "num": 1 }, { "_id": ObjectId("612b3deb36239d3a8307cfe2"), "order_id": "1", "title": "商品鍵盤3", "price": 0, "num": 1 }] } { "_id": ObjectId("612b399436239d3a8307cfdc"), "order_id": "2", "uid": 7, "trade_no": "222", "all_price": 90, "all_num": 2, "items": [{ "_id": ObjectId("612b399436239d3a8307cfe0"), "order_id": "2", "title": "牛奶", "price": 50, "num": 1 }, { "_id": ObjectId("612b399736239d3a8307cfe1"), "order_id": "2", "title": "酸奶", "price": 40, "num": 1 }] } { "_id": ObjectId("612b399436239d3a8307cfdd"), "order_id": "3", "uid": 9, "trade_no": "333", "all_price": 20, "all_num": 6, "items": [{ "_id": ObjectId("612b3f1136239d3a8307cfe3"), "order_id": "3", "title": "礦泉水", "price": 2, "num": 1 }, { "_id": ObjectId("612b3f1236239d3a8307cfe4"), "order_id": "3", "title": "毛巾", "price": 10, "num": 1 }] }
==
db.order.aggregate([ { $lookup:{ from:"order_item", localField:"order_id", foreignField:"order_id", as:"items" } }, { $match:{"all_price":{$gte:90}} //order表內 篩選出all_price >= 90 的數據 } ])
精簡一下數據
db.order.aggregate([ { $lookup:{ from:"order_item", localField:"order_id", foreignField:"order_id", as:"items" } }, { $match:{"all_price":{$gte:90}} }, { $project:{order_id:1,trade_no:1,items:1} //主表值顯示這3個字段 記得要把items寫進去 } ])
結果
{ "_id": ObjectId("612b399436239d3a8307cfdb"), "trade_no": "111", "items": [{ "_id": ObjectId("612b399436239d3a8307cfde"), "order_id": "1", "title": "商品鼠標1", "price": 50, "num": 1 }, { "_id": ObjectId("612b399436239d3a8307cfdf"), "order_id": "1", "title": "商品鍵盤2", "price": 50, "num": 1 }, { "_id": ObjectId("612b3deb36239d3a8307cfe2"), "order_id": "1", "title": "商品鍵盤3", "price": 0, "num": 1 }] } { "_id": ObjectId("612b399436239d3a8307cfdc"), "trade_no": "222", "items": [{ "_id": ObjectId("612b399436239d3a8307cfe0"), "order_id": "2", "title": "牛奶", "price": 50, "num": 1 }, { "_id": ObjectId("612b399736239d3a8307cfe1"), "order_id": "2", "title": "酸奶", "price": 40, "num": 1 }] }
-