Skip to content

数据库我们学习了 mysql,这节来再来学下 mongodb。

在 docker desktop 搜索 mongo 镜像,然后把它跑起来:

指定容器名、映射的端口号,以及挂载到 /data/db 的本地目录:

这个本地目录是本地的任何一个目录都行,用来存放 mongodb 的数据的。

跑起来之后,进入 terminal,开始学习 mongodb 的 crud:

输入 mongosh,就可以敲 mongo 命令了:

show dbs;
show databases;

查看下现有的 database。

和 mysql 一样,mongodb 也是通过一个个 database 来存储不同数据的,只不过 mysql 的 database 里存的是 table,而 mongo 里存的是 Collection。

创建或者切换 database 用 use

use hello-mongo;

然后 db 命令查看当前 database:

db;

但这时候你再用 show dbs 会发现没有这个 db:

这是因为默认有了一个 collection 之后才会把 database 写入硬盘。

db.createCollection('aaa');

创建了一个 collection 之后,再次 show dbs,这时候就看到这个新的 database 了:

如果你想删除 database,用这个命令:

db.dropDatabase();

创建和删除 database 我们会了,然后是 collection:

用 db.createCollection 创建 db,然后可以用 db.xxx.drop() 删掉。

接下来向 collection 中插入几个 document:

db.xxx.insertOne({ name: 'guang', age: 20, phone: '13222222222'});

db.xxx.insertMany([{ name: 'dong', age: 21}, {name: 'xxx', hobbies: ['writing']}]);

db.xxx.insertMany([{ name: 'dong2', age: 20}, {name: 'guang2', hobbies: ['writing']}]);

可以看到,插入的数据可以是任意结构的,这就是 mongodb 和 mysql 的最大区别。

不像 mysql 只能在 table 里存结构化的记录一样,mongodb 的 collection 里可以存任意结构的 document。

再就是 mysql 是需要用 sql 来 crud 的,而 mongodb 里是用 api。

但完成的功能是一样的,可以在 mongodb 文档里看到每个 api 的介绍下面都有对应的 sql 写法:

我们试下查询:

db.xxx.find({age: 20});

db.xxx.findOne({ age: 20});

find 是查询多条记录,而 findOne 只返回第一条。

当不传过滤条件的时候,就是返回所有的 Document:

db.xxx.find()

查询条件有多个值的时候这样写,类似 sql 的 in:

db.xxx.find({ age: { $in: [20, 21]}})

in 是包含, nin 是不包含。

类似 in 的还有 gt(great than)、lt(less than)、gte(great than equal )、lte(less than equal )、ne(not equal)

多个条件的时候用 and:

db.xxx.find({ $and: [{age: { $gte: 20 }}, { name: /dong\d/}]})

db.xxx.find({ $and: [{age: { $gte: 20 }}, { name: /dong*/}]})

搜索 age 大于等于 20,并且名字包含 dong 的 Document,这里用的正则做的模糊匹配:

用 or 的话就是两个条件满足一个就行:

db.xxx.find({ $or: [{age: { $gt: 20 }}, { name: /dong*/}]})

分页用的是 skip 和 limit 方法:

db.xxx.find().skip(1).limit(2)

从第一条 Document 开始,取 2 条:

更新的话用 updateOne、updateMany 方法:

db.xxx.updateOne({ name: 'guang'}, { $set: {age: 30} })

如果在更新的时候带上时间戳,可以用 $currentDate:

db.xxx.updateOne({ name: 'guang'}, { $set: {age: 30}, $currentDate: { aaa: true } })

如果你想替换整个的 document,那么用 replaceOne:

db.xxx.replaceOne({name: 'guang'}, { age: 30})

删除的话,也有 deleteOne 和 deleteMany 两个方法:

db.xxx.deleteMany({ age: { $gt: 20 }});

此外,还有 count 可以计数:

db.xxx.count()

db.xxx.count({ name: /guang/})

sort 可以排序,1 是升序、-1 是降序:

db.xxx.find().sort({ age: -1})

按照 age 降序:

db.xxx.find().sort({ age: -1, name: 1})

先按照 age 降序,再按照 name 升序:

这样,CRUD 我们都过了一遍。

当然,这些操作也都可以在 GUI 里可视化的搞,这样就不用敲命令了:

下载官方 GUI 工具 Mongo Compass

连接上 mongodb 的 server:

在 GUI 工具里操作就很方便直观了:

可以看到所有的 database、collection、document。

在这里输入过滤条件后点击 find:

更新和删除也都很直观:

总结

这节我们入门了 mongodb。

它的 database 下是 collection,collection 包含多个 document。

document 可以是任意结构的,这点和 mysql 的 table 不同。

mongo 是通过 api 来做 CRUD 的,不是用的 sql。

我们过了一遍常用的命令和 api:

show dbs; // 显示 database
show databases;

use hello-mongo; // 切换或者创建 database

db; // 查看当前 database

db.dropDatabase(); // 删除 database

db.createCollection('aaa'); // 创建 collection

db.xxx.drop() //删除 collection

db.xxx.insertOne({ name: 'guang', age: 20, phone: '13222222222'});// 插入 document

db.xxx.insertMany([{ name: 'dong', age: 21}, {name: 'xxx', hobbies: ['writing']}]);

db.xxx.find({age: 20}); // 查询 collection

db.xxx.findOne({ age: 20});

db.xxx.findOne(); // 查询所有 collection

db.xxx.find({ age: { $in: [20, 21]}}) // 使用 in、nin 查询多个值

db.xxx.find({ $and: [{age: { $gte: 20 }}, { name: /dong\d/}]}) // 使用 and 指定多个条件同时成立

db.xxx.find({ $or: [{age: { $gt: 20 }}, { name: /dong*/}]}) // 使用 or 表示或者

db.xxx.find().skip(1).limit(2) // 使用 skip + limit 实现分页

db.xxx.updateOne({ name: 'guang'}, { $set: {age: 30}, $currentDate: { aaa: true } }) // updateOne、updateMany 更新

db.xxx.replaceOne({name: 'guang'}, { age: 30}) // 整体替换

db.xxx.deleteMany({ age: { $gt: 20 }}); // deleteOne、deleteMany 删除

db.xxx.count({ name: /guang/})

db.xxx.find().sort({ age: -1, name: 1})

当然,平时不用敲 api,用 Mongo Compass 的 GUI 工具操作非常简单。