美文网首页
mongoDB表与表的关系及聚合管道查询

mongoDB表与表的关系及聚合管道查询

作者: Mr无愧于心 | 来源:发表于2020-06-08 09:38 被阅读0次

    MongoDB 中的关系可以是:

    1. (1对1)
      eg:一个人一张身份证
    2. (1对多)
      eg:一个班级多个学生
    3. (多对1)
      eg: 多个学生一个班级
    4. (多对多)
      eg: 一个商品被多人购买,一个人购买多个商品

    MongoDB 聚合管道(Aggregation Pipeline)
    使用聚合管道可以对集合中的文档进行变换和组合。

    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

    管道操作符
    $project 修改文档的结构,可以用来重命名、增加或删除文档中的字段。
    $match 用于过滤文档。用法类似于 find() 方法中的参数。
    $limit 用来限制MongoDB聚合管道返回的文档数
    $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})
    
    order_item集合中的数据
    order集合中的数据
      1. $project
        eg: 要求查找 order 只返回文档中 trade_no 和 all_price 字段
      db.order.aggregate([ {
        $project:{ 
          _id:0,//不包含_id
          trade_no:1, //包含trade_no
          all_price:1,//包含all_price
       } }
      ])
      
    查找 order 只返回文档中 trade_no 和 all_price 字段
      1. $match
        eg: 找出order集合中all_price大于等于90的数据,只保留trade_no和all_price字段
      db.order.aggregate([ {
        $project:{ _id:0,trade_no:1, all_price:1 } },
      {
        $match:{"all_price":{$gte:90}}
      } ])
      
    all_price大于等于90的数据,只保留trade_no和all_price字段
      1. $group
        eg:统计每个订单的订单数量,按照订单号分组
      db.order_item.aggregate( [
        {
          $group: {_id: "$order_id", total: {$sum: 1}}
        }
       ]
      )
      
    统计每个订单的订单数量
      1. $sort
        将集合中的文档进行排序。
        eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的,all_price按倒序排列
      db.order.aggregate([ {
        $project:{ _id:0, trade_no:1, all_price:1 } },
      {
        $match:{"all_price":{$gte:90}}
      }, {
        $sort:{"all_price":-1} }
      ])
      
    统计只有trade_no和all_price字段,并且只要all_price大于等于90的,all_price按倒序排列
    1. $limit
      eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的倒序排列,只取第一项
      db.order.aggregate([ {
        $project:{ trade_no:1, all_price:1 } },
      {
        $match:{"all_price":{$gte:90}}
      }, {
        $sort:{"all_price":-1} },
      {
        $limit:1
      } ])
      
    image.png
    1. $skip
      eg: 统计只有trade_no和all_price字段,并且只要all_price大于等于90的倒序排列,跳过一项
      db.order.aggregate([ {
        $project:{ trade_no:1, all_price:1 } },
      {
        $match:{"all_price":{$gte:90}}
      }, {
        $sort:{"all_price":-1} },
      {
        $skip:1
      } ])
      
    image.png
    1. $lookup 表关联
      eg: 两个表的数据合并找出有用的数据,拼接成有效接口
      db.order.aggregate([ 
        {
          $lookup: {
            from: "order_item",
            localField: "order_id", 
            foreignField: "order_id", 
            as: "items"
          }
        },
        { 
          $project: { 
            _id:0,
            trade_no: 1, 
            all_price: 1,items: 1
          } 
        }
      ]).pretty()
      //pretty格式化文档(json格式化)
      //$lookup: {
            //from: "order_item", 附属表
            //localField: "order_id", 主表order对应的字段
            //foreignField: "order_id", 附属表order_item对应的字段
            //as: "items"  新的字段名
          }
      
    image.png

    相关文章

      网友评论

          本文标题:mongoDB表与表的关系及聚合管道查询

          本文链接:https://www.haomeiwen.com/subject/ntmvzhtx.html