zoukankan      html  css  js  c++  java
  • MongoDB的高级查询aggregate聚合管道

    一、MongoDB 聚合管道(Aggregation Pipeline)

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

    实际项目:表关联查询、数据的统计。

    MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法来构建和使用聚合管道。

    二、MongoDB Aggregation 管道操作符与表达式

    管道操作符

    Description

    $project

    增加、删除、重命名字段 

    $match

    条件匹配。只满足条件的文档才能进入下一阶段

    $limit

    限制结果的数量

    $skip

    跳过文档的数量

    $sort

    条件排序。

    $group

    条件组合结果  统计

    $lookup

    $lookup 操作符 用以引入其它集合的数据  (表关联查询)

     

     

     

     

     

     

    SQLNOSQL对比:

    WHERE

    $match

    GROUP BY

    $group

    HAVING

    $match

    SELECT

    $project

    ORDER BY

    $sort

    LIMIT

    $limit

    SUM()

    $sum

    COUNT()

    $sum

    join

    $lookup

     

     

     

     

     

     

     

     

    管道表达式:

    管道操作符作为“键”,所对应的“值”叫做管道表达式。


    例如{$match:{status:"A"}},$match称为管道操作符,而status:"A"称为管道表达式,是管道操作符的操作数(Operand)。

    每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。

    常用表达式操作符

    Description

    $addToSet

    将文档指定字段的值去重

    $max

    文档指定字段的最大值

    $min

    文档指定字段的最小值

    $sum

    文档指定字段求和

    $avg

    文档指定字段求平均

    $gt

    大于给定值

    $lt

    小于给定值

    $eq

    等于给定值

     

     

     

     

     

    二、 数据模拟

    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

    修改文档的结构,可以用来重命名、增加或删除文档中的字段。

    要求查找order只返回文档中 trade_no和 all_price字段

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

    二、$match

    作用

    用于过滤文档。用法类似于 find() 方法中的参数。

    db.order.aggregate([
    {
        $project:{ trade_no:1, all_price:1 }
    },
    {
        $match:{"all_price":{$gte:90}}
    }
    ])

    二、$group

    将集合中的文档进行分组,可用于统计结果。

    统计每个订单的订单数量,按照订单号分组

    db.order_item.aggregate(
        [
             {
                  $group: {_id: "$order_id", total: {$sum: "$num"}}
             }
        ]
       )

    $sort

    将集合中的文档进行排序。

    db.order.aggregate([
    {    
      $project:{ trade_no:1, all_price:1 }
    },
    {
      $match:{"all_price":{$gte:90}}
    },
    {
      $sort:{"all_price":-1}
    }
    
    ])

    $limit

    db.order.aggregate([
    {    
        $project:{ trade_no:1, all_price:1 }
    },
    {
        $match:{"all_price":{$gte:90}}
    },
    {
        $sort:{"all_price":-1}
    },
    {
        $limit:1
    }
    
    ])

    $skip

    db.order.aggregate([
    {    
        $project:{ trade_no:1, all_price:1 }
    },
    {
        $match:{"all_price":{$gte:90}}
    },
    {
        $sort:{"all_price":-1}
    },
    {
        $skip:1
    }
    
    ])

    $lookup 表关联

    db.order.aggregate([
        {
          $lookup:
            {
              from: "order_item",
              localField: "order_id",
              foreignField: "order_id",
              as: "items"
            }
       }
    ])
  • 相关阅读:
    H5前端上传文件的几个解决方案
    MyEclipse和Eclipse各个版本的汉化破解(包括7.59.0和Eclips的ehelios、indigo各版本)
    学习C#中的事件和委托
    JS学习笔记(一)JS处理JSON数据
    图解Eclipse开发C++、C语言的配置过程使用CDT和MinGw
    ASP.NET使用C#实现的最简单的验证码方法
    微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
    PHP开发笔记(二)PHP的json_encode和json_decode问题
    C博客作业00——我的第一篇博客
    extern "c"
  • 原文地址:https://www.cnblogs.com/loaderman/p/11570683.html
Copyright © 2011-2022 走看看