關系型數據庫表(集合)與表(集合)之間的關系 聚合查詢


-

關系型數據庫表與表的幾種關系

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
    }]
}

 

 

 

 

 

-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM