课程名称:web前端架构师
课程章节:第14周 第七章 mongodb 高级内容
主讲老师:张轩
课程内容: mongodb 数据关系
不同集合的数据关系
两种实现手段
- 内嵌
- 引用
内嵌
之前使用的集合就是内嵌的. hobbies时内嵌的
// 1
{
"_id": ObjectId("635a37b110f9b16ff81f6cb1"),
"username": "aaa",
"password": "123456",
"hobbies": [
"play",
"sleep"
],
"date": ISODate("2022-10-27T09:47:29.324Z"),
"age": NumberInt("12"),
"createAt": ISODate("2022-10-27T07:48:01.475Z"),
"__v": NumberInt("0")
}
// 2
{
"_id": ObjectId("635a53ed99310000a9001714"),
"username": "root",
"password": 1234567,
"hobbies": [
"play"
],
"age": 20
}
引用
有两个集合, 球员和球队两个集合 。例如我们知道球队的名字,想要查找球队下所有的球员
我们可能需要两次查询
- 根据名字查找球队
- 根据球队 id 查找球员
var team = db.teams.find({
name: "Lakers"
});
db.users.find({
team: team._id
});
聚合的概念和基本用法
聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回相应的结果。
聚合常用操作符
- $group 将collection中的document分组,可用于统计结果
- $match 过滤数据,只输出符合结果的文档
- $project 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
- $sort 将结果进行排序后输出
- $limit 限制管道输出的结果个数
- $skip 跳过制定数量的结果,并且返回剩下的结果
Group 的书写格式
文档:https://docs.mongodb.com/manual/reference/operator/aggregation/group/#std-label-accumulators-group
例如查询球队分组结果
db.users.aggregate({
$group: {
_id: "$team"
}
})
表达式操作符
KaTeX parse error: Expected ‘EOF’, got ‘计’ at position 5: sum 计̲算总和,{sum: 1}表示返回总和×1的值(即总和的数量),使用 {sum: 'sum: ′制定字段’}
也能直接获取制定字段的值的总和
- $avg 求平均值
- $min 求min值
- $max 求max值
- $push 将结果文档中插入值到一个数组中
- $first 根据文档的排序获取第一个文档数据
- $last 同理,获取最后一个数据
例如我们想要将球队球员的年龄相加
db.users.aggregate({
$group: {
_id: "$team",
total: {
$sum: '$age'
}
}
})
多个操作符一起使用
db.users.aggregate([{
$group: {
_id: "$team",
total: {
$sum: "$age"
},
avgage: {
$avg: "$age"
},
count: {
$sum: 1
}
}
}, {
$sort: {
total: 1
}
}])