课程名称: Node.js工程师养成计划
课程章节: Node 框架实战篇 - 项目数据持久化存储
课程讲师: 北瑶
课程内容:
什么是 MongoDB
- 官方文档: https://www.mongodb.com/
- MongoDB 是由 c++ 语言编写的, 是一个基于分布式文件存储的开源 NoSQL 数据库系统
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品, 是非关系数据库当中功能最丰富, 最像关系数据库的, 这会让曾经使用过关系型数据库的人比较容易上手
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
- MongoDB 的查询功能非常强大
- 不仅支持大部分关系型数据库中的单表查询,还支持范围查询、排序、聚合、MapReduce 等
- MongoDB 的查询语法类似于面相对象的程序语言
安装 MongoDB
目前版本6.0.1, 与5.x版本不同
- 首先下载 https://www.mongodb.com/try/download/shell
- 直接下载压缩包解压即可
- 将解压出来的bin目录添加到环境变量
- 在cmd中输入mongosh即可进入命令行界面
Mongo Shell 执行环境
MongoDB 的命令行链接工具 mongo shell ,提供了 JavaScript 执行环境,内置了一些数据库操作命令show dbs
查看当前数据库列表db
查看当前所在数据库use xxx
切换到xxx数据库show collections
显示库中的所有集合
等等……,提供了一大堆的内置 API 用来操作数据库
退出连接:exit
、 quit()
、Ctrl + C
MongoDB 中的数据存储结构
由于 MongoDB 是文档型数据库,其中存储的数据就是熟悉的 JSON 格式数据。
- 可以把 MongoDB 数据库想象为一个超级大对象
- 对象里面有不同的集合
- 集合中有不同的文档
数据库
在 MongoDB 中, 数据库包含一个或多个文档集合
查看数据库列表
show dbs
查看当前数据库
db
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin :
从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local:
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合config:
当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
创建/切换数据库
use 数据库名
在 MongoDB 中数据库只有真正的有了数据才会被创建出来
你可以切换到不存在的数据库。首次将数据存储在数据库中(例如通过创建集合)时,MongoDB 会创建数据库。例如,以下代码在 insertOne()
操作期间创建数据库 myNewDatabase
和集合 myCollection:
use myNewDatabase
db.myCollection.insertOne({ x: 1, y: 2 });
数据库名称规则
- 不区分大小写,但是建议全部小写
- 不能包含空字符。
- 数据库名称不能为空
- 数据库名字不能有特殊字符:
/\. "$*<>:|?
删除数据库
- 使用 use 命令切换到要删除的数据库(自杀)
- 使用
db.dropDatabase()
删除当前数据库
集合
集合类似于关系数据库中的表,MongoDB 将文档存储在集合中。
创建集合
如果不存在集合,则在您第一次为该集合存储数据时,MongoDB 会创建该集合。db.集合名.insert({x: 1})
MongoDB提供db.createCollection(name, options)
方法来显式创建具有各种选项的集合, 列如设置最大大小或文档验证规则. 如果未指定这些选项, 则无需显式创建集合, 因为首次存储集合数据时, MongoDB 会创建新集合。
查看集合
show collections
删除集合
db.集合名称.drop()
使用 db.集合名称.find()
查看集合中的文档数据
_id字段
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id
字段作为主键。如果插入的文档省略 _id 字段,则 MongoDB 驱动程序会自动为 _id
字段生成 ObjectId
。
- 默认情况下,MongoDB 在创建集合时会在 _id 字段上创建唯一索引。
- _id 字段始终是文档中的第一个字段
- _id 字段可以包含任何 BSON 数据类型的值,而不是数组。
- 可以自定义传入,但是非常不建议
插入文档
插入单个文档
db.cc.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
插入多个文档
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
插入行为
- 集合创建
如果该集合当前不存在,则插入操作将创建该集合。 - _id 字段
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略 _id 字段,则 MongoDB 驱动程序会自动为 _id 字段生成 ObjectId。
查询文档
查询所有文档db.集合名.find({})
等价于 SQL 中的 SELECT * FROM inventory
语句。
相等条件查询db.集合名.find({ status: "D" })
等价于 SQL 中的 SELECT * FROM inventory WHERE status = "D"
语句。
查询运算符
更新文档
单个db.collection.updateOne()
多个db.collection.updateMany()
删除文档
单个db.inventory.deleteMany({ status : "A" })
多个db.inventory.deleteOne( { status: "D" } )
链接 MongoDB
- 在服务端操作 MongoDB:https://docs.mongodb.com/drivers/
- 在 Node.js 中操作 MongoDB:https://docs.mongodb.com/drivers/node/
安装: npm install mongodb
安装mongoDB 链接模块
const {
MongoClient
} = require('mongodb'); // 导入
// 初始化链接对象
const client = new MongoClient('mongodb://127.0.0.1:27017');
// 链接操作是异步执行的,可以使用异步处理方法
const main = async () => {
// 创建链接
await client.connect();
// 指定链接的数据库名
const db = client.db('mytest');
// 链接数据库中的执行集合
const cc = db.collection('cc');
// 操作集合中的文档数据
let d = await cc.find();
console.log(await d.toArray());
}
// 断开链接
main().finally(() => client.close());
学习心得
通过这章的学习, 学会了 服务端与SQL的链接与交互, 掌握了 mongoDB 基本指令