• 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"
            }
       }
    ])
  • 相关阅读:
    第八章 1 元组简介
    第七章 5 字典生成式
    第七章 4 字典的视图操作、字典的遍历、字典的特点
    第七章 3 字典的常用操作(增删改查)
    第七章 2 字典的创建以及字典元素的获取
    第七章 1 字典介绍
    Java 中 Executors.newSingleThreadExecutor() 与Executors.newFixedThreadPool(1)有什么区别
    Java 使用线程池执行若干任务
    使用Jacoco获取 Java 程序的代码执行覆盖率
    基于 Golang 完整获取百度地图POI数据的方案
  • 原文地址:https://www.cnblogs.com/loaderman/p/11570683.html
Copyright © 2020-2023  润新知