目录
- 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"
登录【admin】数据库的 mongodb 客户端命令
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
登录【test】数据库的 mongodb 客户端命令
mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456
聚集运算
SQL 术语 与 Mongodb 的对应关系
语法格式:
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},
])
测试数据
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】,一列是【总和】
] )
查询结果
2、 $sum 统计记录条数
item 集合中,根据 【name】 字段进行分组,统计【price】大于 30 的文档有多少条。
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", count: {$sum: 1}}}
])
//{$sum: 1} 表示查询到的数据,每一行算 1 。
查询结果
3、 $avg 计算平均值
item 集合中,根据 【name】 字段进行分组,计算【price】的平均值。
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", avg: {$avg: "$price"}}}
])
查询结果
4、$max 查询最大值
item 集合中,根据 【name】 字段进行分组,查询【price】的最大值。
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", max: {$max: "$price"}}}
])
查询结果
5、$min 查询最小值
item 集合中,根据 【name】 字段进行分组,查询【price】的最小值
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", min: {$min: "$price"}}}
])
查询结果
6、$addToSet:将所有值添加到Set集合中
item 集合中,根据 【name】 字段进行分组,把【price】字段的值都添加到【prices】这个字段里面
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", prices: {$addToSet: "$price"}}}
])
查询结果
7、$first : 查询结果中的第一个数据
item 集合中,根据 【name】 字段进行分组,获取分组后的第一个【price】数据
查询过命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", prices: {$first: "$price"}}}
])
查询结果
8、$last : 查询结果中的最后一个数据
item 集合中,根据 【name】 字段进行分组,获取分组后的最后一个【price】数据
查询命令
db.item.aggregate([
{$match: {price: {$gt: 30}}},
{$group: {_id: "$name", prices: {$last: "$price"}}}
])
查询结果
9、 演示 $mergeObjects: 将多个对象的key-value合并到最终结果中。
$mergeObjects: 它操作的字段值必须是对象。
1、$set:添加一个子文档
先随便添加一个子文档。
【$set】 操作符将会在 price 字段等于 20 的文档中设置一个名为 【prop 】的子文档。
该子文档包含两个字段:name 和 age
修改命令
db.item.update(
{price: 20},
{$set: {prop: {name: "笔记本电脑", age: 666}}}
)
命令解释
db.item.update(
// 相当于 where 子句
{price: 20},
// 这个相当于 set 条件
{$set: {prop: {name: "笔记本电脑", age: 666}}}
)
修改结果
2、$set:再添加一个子文档
先随便添加一个子文档。
【$set】 操作符将会在 price 字段等于 10 的文档中设置一个名为 【prop 】的子文档。
该子文档包含两个字段:height 和 hobby
修改命令
db.item.update(
{price: 10},
{$set: {prop: {height: "一米八", hobby: "打篮球"}}}
)
修改结果
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】对象
修改结果
10、skip() 和 limit() 进行分页查询
如果要做分页,可以直接使用 find()方法返回值的 skip()、limit()方法,可在命令行通过 db.集合名.find().help()查看。
查询命令
skip(0) 表示跳过前面 0 条数据(即第一页的数据),limit(3) 表示返回 3 条数据(即第二页的数据)
db.item.find().skip(0).limit(3)
查询结果
skip(2) 表示跳过前面 2 条数据(即第一页的数据),limit(3) 表示返回 3 条数据(即第二页的数据)