1 文章概述
1.1 基本概念
MongoDB是一种非关系型数据库,数据最终存储为BSON(Binary JSON)类型。MongoDB包含三个重要逻辑概念:数据库、集合和文档,与关系型数据库相关概念映射如下图:
1.2 数据准备
1.2.1 逻辑设计
bookdb数据库包含library与book两个集合,相关字段说明如下图:
1.2.2 新增数据
// 创建数据库
use bookdb
// 新增图书馆
db.library.insertMany([
{
"_id": 1,
"library_name": "图书馆_1"
},
{
"_id": 2,
"library_name": "图书馆_2"
},
{
"_id": 3,
"library_name": "图书馆_3"
}
])
// 新增图书
db.book.insertMany([
{
"_id": 1,
"book_type": 1,
"book_name": "图书_1",
"book_price": 10,
"book_count": 100,
"borrowers": [{
"name": "张三",
"id": 100
}, {
"name": "李四",
"id": 200
}],
"library_id": 1
},
{
"_id": 2,
"book_type": 2,
"book_name": "图书_2",
"book_price": 20,
"book_count": 100,
"borrowers": [{
"name": "张三",
"id": 100
}],
"library_id": 2
},
{
"_id": 3,
"book_type": 1,
"book_name": "图书_3",
"book_price": 30,
"book_count": 100,
"borrowers": [{
"name": "张三",
"id": 100
}, {
"name": "王五",
"id": 300
}],
"library_id": 2
}
])
2 聚合概念
2.1 基本语法
MongoDB聚合语法第一个参数是管道:文档在上个管道处理完后传递给下个管道,第二个参数是选项:设置聚合操作特性
db.collection.aggregate(pipeline, options)
2.2 聚合管道
常用聚合管道有以下九种类型:
$project:对文档进行投影
$limit:输出管道内前N个文档
$skip:跳过管道内前N个文档
$sort:对文档进行排序
$out:输出管道中文档
$match:对文档进行筛选
$unwind:铺平文档中的数组字段
$lookup:对文档进行查询
$group:对文档进行分组
3 聚合实例
3.1 project
1表示展示某字段
0表示不展示某字段
借阅人编号和姓名拆分成两个数组
db.book.aggregate({
$project: {
"_id": 0,
"book_name": 1,
"borrowerIds": "$borrowers.id",
"borrowerNames": "$borrowers.name"
}
})
---------------------------------------------------------
// 1
{
"book_name": "图书_1",
"borrowerIds": [
100,
200
],
"borrowerNames": [
"张三",
"李四"
]
}
// 2
{
"book_name": "图书_2",
"borrowerIds": [
100
],
"borrowerNames": [
"张三"
]
}
// 3
{
"book_name": "图书_3",
"borrowerIds": [
100,
300
],
"borrowerNames": [
"张三",
"王五"
]
}
3.2 limit
只展示一个投影结果
db.book.aggregate([
{
$project: {
"_id": 0,
"book_name": 1,
"borrowerIds": "$borrowers.id",
"borrowerNames": "$borrowers.name"
}
},
{
$limit: 1
}
])
---------------------------------------------------------
// 1
{
"book_name": "图书_1",
"borrowerIds": [
100,
200
],
"borrowerNames": [
"张三",