MongoDB聚合管道

管道操作符

  •  $project   增加、删除、重命名字段 (可以筛选指定的字段出现)
  •  $match        条件匹配,只有满足条件的文档才能进入下一个阶段
  •  $limit        限制结果的数量
  •  $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})

     

$project

  • db.order.aggregate([
      {
          $project: {order_id: 1, trade_no: 1, all_price: 1}
      }
    ])

     

  • 从order文档中筛选所有数据,只需要 order_id trade_no all_price 字段的数据

$match

  • 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 字段的取值进行分组,并生成一个 total 字段取值是每个分组的 num 字段累加的值

$limit

  • db.order_item.aggregate([
      {
        $sort: {"price": -1}
      }
    ])

     

  • 以 price 字段的值降序排列 

$limit

  • db.order.aggregate([
      {
        $sort: {"all_price": -1}
      },
      {
        $limit: 1
      }
    ])

     

  • 以 all_price 字段进行降序排列并返回一条数据

$skip

  • db.order.aggregate([
      {
        $skip: 1
      }
    ])

     

  • 跳过一条数据显示

$lookup

  • db.order.aggregate([
      {
        $lookup: {
          from: "order_item",
          localField: "order_id",
          foreignField: "order_id",
          as: "items"
        }
      }
    ])

     

  • form 关联的表
  • foreignField 关联的字段
  • localField 当前文档的字段
  • as 生成的字段
  • db.order.aggregate([
      {
        $lookup: { // 关联查询
          from: "order_item", // 关联文档
          foreignField: "order_id", // 关联文档的字段
          localField: "order_id", // oder 文档的字段
          as: "items", // 匹配的结果放到 items 字段中
        }
      },
        {
          $project: { // 只保留以下字段
            trade_no: 1, all_price: 1, items: 1
          }
        },
        {
          $match: { // 满足条件
            "all_price": {$gte: 90} // 大于等于 90
          }
        },
        {
          $sort: { // 排序
            "all_price": -1, // -1 降序    (1 升序)
          }
        }
    ])

     

posted @ 2022-06-02 11:14  霸哥yyds  阅读(58)  评论(0)    收藏  举报