数据层级关系
mongodb 数据分为三层,分别是 db,collection,document。collection 相当于 table,document 就是一条条的 record。
安装和启动
推荐通过docker安装:
docker run -d --name mongodb -p 27017:27017 mongo
这里介绍一下mongod:mongod 是启动 MongoDB 数据库服务的命令,全称是 Mongo Daemon,是 MongoDB 运行的核心。如果你在本地开发或测试,直接运行 mongod 即可启动服务;在 Docker 中,镜像会帮你处理这一步。
mongoshell
mongodb 安装时会自带一个名为 mongosh 的 shell,而这个 shell 本质上也是一个 JavaScript 解释器。所以在里面可以直接执行 js 命令。
在 MongoDB 8.0 版本中,启动 MongoDB Shell 的命令是 mongosh,而不是早期版本中使用的 mongo 命令。mongosh 是 MongoDB 提供的新一代 Shell 工具,从 MongoDB 4.4 开始引入,并在后续版本中逐步取代旧的 mongo Shell。
市面上有一些 mongo 的可视化管理工具,比如官方的 MongoDB Compass,Navicat for MongoDB 等。推荐用免费的 MongoDB Compass。在我的工作中,一般在两种环境下执行mongo查询。一种是mongoshell,一种是mongodb compass。如果是在内网或者docker环境,那么只能用mongoshell。因为mongo的数据往往是嵌套结构,且json格式在记录长度较长时,整个窗口都是一坨字符,可读性很差。补救措施是在查询语句后面加上pretty()
,结合projection,输出会美观些。
CRUD 和 关系型数据库的区别
Mongodb最核心的优势是它的灵活性,文档结构使得它支持嵌套数据结构。从创建数据库开始,不需要显式的声明创建,只需要use dbname
,然后在你的第一个插入语句中写上:
db.users.insertOne({
name: "Jason",
age: 18,
address: {
city: "Beijing",
street: "Beijing Road",
},
});
这样,数据库和collection都建成了。
aggregation pipeline
聚合管道,不只有聚合操作。实际上是一个数组,每个元素为 stage,并按排列顺序执行。
db.orders.aggregate([
// Stage 1: Filter pizza order documents by pizza size
{
$match: { size: "medium" },
},
// Stage 2: Group remaining documents by pizza name and calculate total quantity
{
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } },
},
]);
查询优化
加索引。mongodb的索引原理和关系型数据库的索引原理差不多。
其次是借助explain来优化查询。在查询语句末尾加上.explain()
来查看查询计划。
mongodb性能从何而来
mongodb的效率还是挺高的,但是带来的一个问题是内存占用高,也是它最为人诟病的一点。mongo运行时间越长,内存占用越高,因为它会将数据缓存在内存中。