美文网首页
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