nodejs操作mongodb之六(聚合函數的使用)

一、使用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}    
        }
    ])
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章