目录

  • MongoDB 的 聚集运算( $ sum、 $ avg、$ max、$ min、$ addToSet、$ mergeObjects、$ first、$ last)
  • 演示前提:
  • 登录单机模式的 mongodb 服务器命令
  • 登录【admin】数据库的 mongodb 客户端命令
  • 登录【test】数据库的 mongodb 客户端命令
  • 聚集运算
  • SQL 术语 与 Mongodb 的对应关系
  • 语法格式:
  • 聚集运算的运算符
  • 添加测试数据
  • 命令
  • 测试数据
  • 1、 $group :指定【name】字段分组, $sum 再统计【price】价格总数
  • 查询命令
  • 命令解释:
  • 查询结果
  • 2、 $sum 统计记录条数
  • 查询命令
  • 查询结果
  • 3、 $avg 计算平均值
  • 查询命令
  • 查询结果
  • 4、$max 查询最大值
  • 查询命令
  • 查询结果
  • 5、$min 查询最小值
  • 查询命令
  • 查询结果
  • 6、$addToSet:将所有值添加到Set集合中
  • 查询命令
  • 查询结果
  • 7、$first : 查询结果中的第一个数据
  • 查询过命令
  • 查询结果
  • 8、$last : 查询结果中的最后一个数据
  • 查询命令
  • 查询结果
  • 9、 演示 $mergeObjects: 将多个对象的key-value合并到最终结果中。
  • 1、$set:添加一个子文档
  • 修改命令
  • 命令解释
  • 修改结果
  • 2、$set:再添加一个子文档
  • 修改命令
  • 修改结果
  • 3、$mergeObjects:将两个子文档的prop字段的值合并到【props】字段中
  • 修改命令
  • 命令解释:
  • 修改结果
  • 10、skip() 和 limit() 进行分页查询
  • 查询命令
  • 查询结果

MongoDB 的 聚集运算( $ sum、 $ avg、$ max、$ min、$ addToSet、$ mergeObjects、$ first、$ last)

演示前提:

登录单机模式的 mongodb 服务器命令

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

mongodb的regex怎么处理括号 mongodb $sum_mongodb

登录【admin】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

mongodb的regex怎么处理括号 mongodb $sum_数据库_02

登录【test】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456

mongodb的regex怎么处理括号 mongodb $sum_数据库_03

聚集运算

SQL 术语 与 Mongodb 的对应关系

mongodb的regex怎么处理括号 mongodb $sum_mongodb的regex怎么处理括号_04

语法格式:

db.collection名.aggregate(pipeline, options)

其中 pipeline 是一个数组,代表一系列聚集操作形成的管道。
管道的意思就是:前一次运算的输出作为后一次运算的输入

聚集操作是系列以$group、$project、$match、$sort……等为 key 的 BSON 文档。

聚集运算可实现对文档 分组、求和、排序、集合连接 等操作。

在聚集运算的字符串中如果要引用 field 的,需要使用“$field名”的形式

聚集运算的运算符

$sum  :计算总数

$avg  :计算平均值

$max  : 查询最大值

$min  :查询最小值

$addToSet: 将所有值添加到Set集合中。

$mergeObjects: 它操作的字段值必须是对象。将多个对象的key-value合并到最终结果中。

$first :查询结果中的第一个数据

$last :查询结果中的最后一个数据

$push :用于将值添加到数组中

$stdDevPop :用于计算指定字段的总体标准偏差

$stdDevSamp :用于计算指定字段的样本标准偏差

添加测试数据

命令
db.item.insert([
    {"name":"键盘",price:10},
    {"name":"键盘",price:20},
    {"name":"键盘",price:30},
    {"name":"键盘",price:40},
    {"name":"键盘",price:50},
    
    {"name":"鼠标",price:60},
    {"name":"鼠标",price:70},
    {"name":"鼠标",price:80},
    {"name":"鼠标",price:90},
    {"name":"鼠标",price:100},
])

测试数据

mongodb的regex怎么处理括号 mongodb $sum_数据_05

1、 $group :指定【name】字段分组, $sum 再统计【price】价格总数

查询 item 集合中,price 价格大于 30 的数据,指定【name】字段进行分组,计算分组后的 【price】的价格总数

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", "价格总数": {$sum: "$price"}}}
])

命令解释:
db.item.aggregate( [

    // $match : 制定过滤条件,相当于 sql 的 where
    { $match: { price: { $gt: 30 } } },  // 表示这个过滤条件就是 【 price 大于 30】
   
    // 在聚集运算的字符串中如果要引用 field 字段,需要使用“$field名”的形式
    // 如这个: $name : 需要在 name 前面加上 $ 符号,表示指定 【name】这个字段   
    
    // $group :就是进行分组,指定按【name】字段来分组
    // { $sum: "$price" }:按【name】分组后,计算该列的 【price】的总和。
    
    { $group: { _id: "$name", 总数: { $sum: "$price" } } }
	
	//这行命令相当于分组分了两列,一列是【name】,一列是【总和】
    
] )

查询结果

mongodb的regex怎么处理括号 mongodb $sum_字段_06

2、 $sum 统计记录条数

item 集合中,根据 【name】 字段进行分组,统计【price】大于 30 的文档有多少条。

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", count: {$sum: 1}}}
])

//{$sum: 1}  表示查询到的数据,每一行算 1 。

查询结果

mongodb的regex怎么处理括号 mongodb $sum_字段_07

3、 $avg 计算平均值

item 集合中,根据 【name】 字段进行分组,计算【price】的平均值。

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", avg: {$avg: "$price"}}}
])

查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb_08

4、$max 查询最大值

item 集合中,根据 【name】 字段进行分组,查询【price】的最大值。

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", max: {$max: "$price"}}}
])
查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb的regex怎么处理括号_09

5、$min 查询最小值

item 集合中,根据 【name】 字段进行分组,查询【price】的最小值

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", min: {$min: "$price"}}}
])

查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb_10

6、$addToSet:将所有值添加到Set集合中

item 集合中,根据 【name】 字段进行分组,把【price】字段的值都添加到【prices】这个字段里面

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", prices: {$addToSet: "$price"}}}
])

查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb的regex怎么处理括号_11

7、$first : 查询结果中的第一个数据

item 集合中,根据 【name】 字段进行分组,获取分组后的第一个【price】数据

查询过命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", prices: {$first: "$price"}}}
])

查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb的regex怎么处理括号_12

8、$last : 查询结果中的最后一个数据

item 集合中,根据 【name】 字段进行分组,获取分组后的最后一个【price】数据

查询命令
db.item.aggregate([
    {$match: {price: {$gt: 30}}},
    {$group: {_id: "$name", prices: {$last: "$price"}}}
])

查询结果

mongodb的regex怎么处理括号 mongodb $sum_字段_13

9、 演示 $mergeObjects: 将多个对象的key-value合并到最终结果中。

$mergeObjects: 它操作的字段值必须是对象。

1、$set:添加一个子文档

先随便添加一个子文档。

【$set】 操作符将会在 price 字段等于 20 的文档中设置一个名为 【prop 】的子文档。

该子文档包含两个字段:name 和 age

修改命令
db.item.update(
    {price: 20},
    {$set: {prop: {name: "笔记本电脑", age: 666}}}
)

mongodb的regex怎么处理括号 mongodb $sum_数据库_14

命令解释
db.item.update(
   
    // 相当于 where 子句
    {price: 20},
    
    // 这个相当于 set 条件
    {$set: {prop: {name: "笔记本电脑", age: 666}}}
)

修改结果

mongodb的regex怎么处理括号 mongodb $sum_数据_15

2、$set:再添加一个子文档

先随便添加一个子文档。

【$set】 操作符将会在 price 字段等于 10 的文档中设置一个名为 【prop 】的子文档。

该子文档包含两个字段:height 和 hobby

修改命令
db.item.update(
    {price: 10},
    {$set: {prop: {height: "一米八", hobby: "打篮球"}}}
)

mongodb的regex怎么处理括号 mongodb $sum_数据_16

修改结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb_17

3、$mergeObjects:将两个子文档的prop字段的值合并到【props】字段中

根据上面添加的子文档,把符合要求的文档,在分组后,将【prop】字段的值,合并到【props】这个字段中。

修改命令
db.item.aggregate([
    {$match: {price: {$gt: 5}}},
    {$group: {_id: "$name", props: {$mergeObjects: "$prop"}}}
])

命令解释:

这个 MongoDB 的聚合查询操作包括了两个阶段,分别是 $match 和 $group:

$match 阶段用于筛选文档,只保留满足条件的文档。在这里,条件是 price 大于 5。

$group 阶段将符合条件的文档按照 name 字段进行分组,并使用 $mergeObjects 操作符将同一组内的文档中的 prop 字段合并为一个【props】对象

修改结果

mongodb的regex怎么处理括号 mongodb $sum_数据库_18

10、skip() 和 limit() 进行分页查询

如果要做分页,可以直接使用 find()方法返回值的 skip()、limit()方法,可在命令行通过 db.集合名.find().help()查看。

查询命令

skip(0) 表示跳过前面 0 条数据(即第一页的数据),limit(3) 表示返回 3 条数据(即第二页的数据)

db.item.find().skip(0).limit(3)
查询结果

mongodb的regex怎么处理括号 mongodb $sum_mongodb_19

skip(2) 表示跳过前面 2 条数据(即第一页的数据),limit(3) 表示返回 3 条数据(即第二页的数据)

mongodb的regex怎么处理括号 mongodb $sum_字段_20