mongo聚合操作命令

简介: mongo聚合操作命令

mongo聚合(aggregate)操作,相比于固定好的find、update等基本操作方法,是相当于其底层操作,可以使用聚合操作执行更为复杂的操作

常用管道符

常用管道 含义
$group 将collection中的document分组,可用于统计结果
$match 过滤数据,只输出符合结果的文档
$project 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
$sort 将结果进行排序后输出
$limit 限制管道输出的结果个数
$skip 跳过制定数量的结果,并且返回剩下的结果
$addFieIds 添加字段字段
$lookup 关联数据
$unwind 将数组类型的字段进行拆分

表达式操作符

常用表达式 含义
$sum | 计算总和,{$sum: 1}表示返回总和×1的值(即总和的数量),使用{$sum: '$制定字段'}也能直接获取制定字段的值的总和
$avg 平均值
$min min
$max max
$push 将结果文档中插入值到一个数组中
$first 根据文档的排序获取第一个文档数据
$last 同理,获取最后一个数据

aggregate操作规范

使用时的基本方法

db.user.aggregate([...操作])

aggregate第一个参数是数组,数组中嵌套单个操作的对象;
例如:查询user表中,name为tom的数据

db.user.aggregate([{
    $match: {
        name: "tom"
    }
}])

管道符操作实操

$group分组

分组一般与计数查询一起使用
示例:按年龄分组并查询各年龄人数

  • _id:必填,分组字段,值可以为null,当为null时,无分组
    db.user.aggregate([{
      $group: {
          _id:"$age",
                  count:{$sum:1}
      }
    }])
    
    在之上的语句中,$group._id字段值为要分组的字段,且字段需以$进行引用;
    如果$group._id值为null或空字符传,则会返回当前表所有数据的个数

$match 查询

过滤数据,只输出符合结果的文档
示例:查询年龄大于等于10且小于等于20的人

db.user.aggregate([{
    $match: {
      //基础的查询操作格式
        age: {
            $gte: 10,$lte: 20
        }
    }
}])

$project字段展示

修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
其实更多的实际应用时,都是作为修改输出字段、限定展示字段(类似元select)

db.user.aggregate([
    {
   
   
        $project: {
   
   
            name: 1,
            age: 1,
            "renameAge": "$age"
        }
    }
])

image.png

$sort排序

与原生排序一样,参数取值为key-value,value为1是正序,为0是倒叙

db.user.aggregate([
    {
   
   
        $project: {
   
   
            name: 1,
            age: 1,
            "renameAge": "$age"
        }
    },
    {
   
   
        $sort: {
   
   
            age: 1
        }
    }
])

image.png

$limit展示

展示条数

db.user.aggregate([
    {
   
   
        $sort: {
   
   
            age: 1
        }
    },
    {
   
   
        $limit: 1
    }
])

image.png

$skip跳过

db.user.aggregate([
    {
   
   
        $sort: {
   
   
            age: 1
        }
    },
    {
   
   
        $skip: 1
    },
    {
   
   
        $limit: 1
    }
])

image.png

$addFieIds 添加字段

db.user.aggregate([
    {
   
   
        "$addFields": {
   
   
            "name1": "$name"
        }
    },
    {
   
   
        $project: {
   
   
            "name": 1,
            "name1": 1
        }
    }
])

image.png

$lookup关联表

关联表,

  • from:同一数据库下等待被关联的表
  • localField:源表中的关联字段
  • foreignField:form的表中与源表的关联字段
  • as:输出为某个字段,如果该字段已存在,则关联结果会覆盖原值
    ```javascript
    db.user.aggregate([
    {
      $lookup: {
          from: "organ",
          localField: "organ_id",
          foreignField: "_id",
          as: "organazition"
      }
    
    }
    ])

![image.png](https://cdn.nlark.com/yuque/0/2022/png/21500184/1657783511997-be850824-1dbc-42f2-89c5-606588646a19.png#clientId=u0343c132-cdf7-4&from=paste&height=272&id=u8e851119&originHeight=544&originWidth=2286&originalType=binary&ratio=1&rotation=0&showTitle=false&size=130887&status=done&style=none&taskId=u635130f3-61c5-4091-a51d-8bcef84c609&title=&width=1143)


<a name="tEnmF"></a>
## $unwind数组类型的字段进行拆分

```javascript
db.user.aggregate([
    {
        $match: {
            _id: ObjectId("6247f55d9dce52289328d993")
        }
    },
    {
        $unwind: "$address"
    }
])

image.png

部分实现场景

分组计数

按年龄分组,并计数每个年龄的人数

db.user.aggregate([
    {
   
   
        $group: {
   
   
            _id: "$age",
            "count": {
   
   
                $sum: 1
            }
        }
    }
])

image.png

按年龄分组,并计数年龄大于18的人数

db.user.aggregate([
    {
   
   
        $match: {
   
   
            age: {
   
   
                $gt: 18
            }
        }
    },
    {
   
   
        $group: {
   
   
            _id: "$age",
            "count": {
   
   
                $sum: 1
            }
        }
    }
])

image.png

将时间格式转化为字符串

db.user.aggregate([
    {
   
   
        "$addFields": {
   
   
            "timestamp": {
   
   
                "$toLong": "$create_time"
            }
        }
    },
    {
   
   
        $project: {
   
   
            name: 1,
            time: {
   
   
                $dateToString: {
   
   
                    format: "%Y-%m-%d %H:%M:%S",
                    date: {
   
   
                        "$add": [new Date(0), "$timestamp", 28800000]
                    }
                }
            }
        }
    },
    {
   
   
        $sort: {
   
   
            time: 1
        }
    }
])
  • [ ] image.png
目录
相关文章
|
数据采集 存储 缓存
如何设计一个网络爬虫?
网络爬虫也被称为机器人或蜘蛛,它被搜索引擎用于发现网络上的新内容或更新内容。内容可以是网页、图片、视频、PDF文件等。网络爬虫开始时会收集一些网页,然后跟随这些网页上的链接收集新的内容
|
文件存储
easyrecovery激活码2022绿色永久使用
Ontrack EasyRecovery是一款非常出色的数据恢复软件,
12905 0
easyrecovery激活码2022绿色永久使用
|
Linux 数据安全/隐私保护
在Linux中,什么是文件权限?什么是rwx权限模型?
在Linux中,什么是文件权限?什么是rwx权限模型?
|
人工智能 IDE 开发工具
实验步骤
【8月更文挑战第22天】实验步骤。
309 1
|
安全 算法 Linux
【Linux】用户和权限管理基本命令详解
【Linux】用户和权限管理基本命令详解
276 1
ACE_Select_Reactor_T 介绍 (2)
ACE_Select_Reactor_T 介绍 (2)
235 0
|
存储 安全 测试技术
区块链网站漏洞检测详情分析
目前移动互联网中,区块链的网站越来越多,在区块链安全上,很多都存在着网站漏洞,区块链的充值以及提现,会员账号的存储性XSS窃取漏洞,账号安全,等等关于这些区块链的漏洞,我们SINE安全对其进行了整理与总结。目前整个区块链网站安全市场的需求是蛮大的,很多区块链网站,也叫数字货币平台,以及数字虚拟币,虚拟钱包,区块链钱包,整体上的区块链网站架构是分5个层,第一层是区块链的应用层:分发行机制,分配机制。第二层是激励层,第三层是共识层:POW,第四层是P2P网络,区块链传播机制,安全验证机制。第五层就是数据层:分区块数据,链式结构,数字签名,哈希函数,Merkle树,非对称加密。
383 0
区块链网站漏洞检测详情分析
|
弹性计算 Linux 开发者