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
目录
相关文章
|
5月前
|
NoSQL Cloud Native MongoDB
mongo 聚合操作
mongo 聚合操作
|
8月前
MongoDB-聚合操作$group
group 括号当中属性的含义: _id: 定义分组规则 <field>: 定义新字段
61 0
|
8月前
MongoDB-聚合操作$out
聚合管道阶段 $out: 将前面阶段处理完的文档写入一个新的集合
73 0
MongoDB-聚合操作$out
|
9月前
|
NoSQL MongoDB Cloud Native
【mongo 系列】mongodb 学习十一,MongoDB 分片集群之分片集合
MongoDB 中 分片集群有专门推荐的模式,例如 分片集合
|
9月前
|
NoSQL JavaScript 前端开发
【mongo 系列】mongodb 学习五,聚合操作实操
在 users 里面准备一组数据,包含 item ,qty,status,tags 和 size 字段,其中 size 是内嵌文档,size 里面又包含了 h,w,uom 字段
|
10月前
|
SQL 存储 JSON
mongo基本命令操作
mongo基本命令操作
106 0
|
SQL NoSQL JavaScript
mongo 进阶之——聚合管道
上面这句话的意思是,先用pumber来进行分组,会有两个字段,一个是"_id"和"count",在后一个管道中用1表示显示,0表示不显示
mongo 进阶之——聚合管道
|
NoSQL 关系型数据库 MySQL
初识Mongodb之聚合管道篇
初识Mongodb之聚合管道篇
95 0
初识Mongodb之聚合管道篇
|
SQL NoSQL Unix
MongoDB:6-MongoDB的聚合和管道
MongoDB:6-MongoDB的聚合和管道
114 0
|
NoSQL Shell 数据库
MongoDB通过Shell 实现集合的日常归档
MongoDB通过Shell 实现集合的日常归档 1.MongoDB数据归档的意义和其他类型的数据库一样,归档对MongoDB同样重要。通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离。
1943 0