文章目录
-
- [一:MongoDB 简介](#一:MongoDB 简介)
-
- [1.1 什么是 MongoDB](#1.1 什么是 MongoDB)
- [1.2 特点](#1.2 特点)
- [1.3 与关系数据库的区别:](#1.3 与关系数据库的区别:)
- [1.4 资源链接:](#1.4 资源链接:)
- [二:安装 MongoDB](#二:安装 MongoDB)
-
- [2.1 安装前的准备](#2.1 安装前的准备)
- [2.2 安装、启动 MongoDB](#2.2 安装、启动 MongoDB)
- [2.3 创建用户 MongoDB](#2.3 创建用户 MongoDB)
- 三、连接
- [四:MongoDB 基础操作](#四:MongoDB 基础操作)
- [五:Mongoose 使用](#五:Mongoose 使用)
-
- [5.1 Mongoose 介绍](#5.1 Mongoose 介绍)
- [5.2 安装](#5.2 安装)
- [5.3 引入](#5.3 引入)
- [5.4 建立链接](#5.4 建立链接)
- [5.5 创建模式](#5.5 创建模式)
- [5.6 创建模型](#5.6 创建模型)
- [5.7 查询数据库, 查看已什么开头的名字](#5.7 查询数据库, 查看已什么开头的名字)
- [5.8 增删查改](#5.8 增删查改)
- [六:备份 、恢复数据](#六:备份 、恢复数据)
- 七:结语
一:MongoDB 简介
1.1 什么是 MongoDB
MongoDB 是一个开源 、基于文档的 NoSQL 数据库 ,使用文档导向的数据模型是一个,它以其高性能、高可用性和易扩展性而闻名,非常适合处理大量的分布式数据。它以 BSON(二进制 JSON)格式存储数据,这使得它在存储复杂数据结构时非常灵活。
1.2 特点
- 高性能:MongoDB 提供高性能的数据持久化。
- 高可用性:通过副本集(Replica Sets)实现数据的自动故障转移。
- 易扩展性:通过分片(Sharding)支持水平扩展。
1.3 与关系数据库的区别:
- MongoDB 中存储的文档必须有一个
_id
键。这个键的值可以是任何类型的,默认是个 ObjectId 对象。 - MongoDB 本身不支持传统关系型数据库中的 JOIN 操作,但支持引用,
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 子文档、嵌套 | 表连接,MongoDB 不支持 |
primary key | primary key | 主键,MongoDB 自动将_id 字段设置为主键 |
1.4 资源链接:
二:安装 MongoDB
2.1 安装前的准备
这里我使用 docker ,这样方便点,如果没有安装 docker,需要先进行 docker 安装
2.2 安装、启动 MongoDB
bash
# 拉取
docker pull mongo:latest
# 运行 , mongodb默认的端口时 27017
docker run -d --name mongo -p 8017:27017 mongo
2.3 创建用户 MongoDB
bash
# 进入容器
docker exec -it mongo mongo admin
# 创建用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
# 验证
db.auth("root", "123456")
三、连接
使用 Navicat 进行连接测试 , 使用上面设置的用户名、密码
root
,123456
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
四:MongoDB 基础操作
4.1 库操作:
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
js
// 显示所有数据库
show dbs
// 切换数据库
use demo
db
// 输出 : demo
// 新增 , 插入一条数据,会自动创建这个数据库 和 集合,并插入该条数据
db.demo.insertOne({"name":"demo name"})
// 删除库
db.dropDatabase()
4.2 集合操作
js
db.createCollection("demo");
// 新增 , 插入一条数据,会自动创建这个数据库 和 集合,并插入该条数据
db.demo.insertOne({ name: "demo name" });
// 更新集合
db.adminCommand({
renameCollection: "test.demo",
to: "test.demos",
});
// 删除集合
db.demo.drop();
4.3 文档操作
常用的插入文档方法包括:
db.collection.insertOne()
:插入单个文档db.collection.insertMany()
:插入多个文档db.collection.save()
:类似于 insertOne()。如果文档存在,则该文档会被更新;如果文档不存在,则会插入一个新文档
查询
MongoDB 查询文档使用 find()
、findOne()
方法。
js
// 查全部
db.myCollection.find({});
// 条件查询
db.myCollection.find({ age: { $gt: 25 } });
编辑
常用的方法包括 updateOne()
、updateMany()
、replaceOne()
和 findOneAndUpdate()
。
js
// 单条
db.myCollection.updateOne(
{ name: "jty" }, // 过滤条件
{ $set: { age: 26 } } // 更新操作
);
// 多条
db.myCollection.updateMany(
{ age: { $lt: 30 } }, // 过滤条件
{ $set: { status: "active" } } // 更新操作
);
// 替换
db.myCollection.replaceOne(
{ name: "jty" }, // 过滤条件
{ name: "jty", age: 31 } // 新文档
);
删除
常用的删除文档方法包括 deleteOne()
、deleteMany()
以及 findOneAndDelete()
。
js
db.demo.deleteOne({ name: "jty" });
db.demo.deleteMany({ status: "1" });
db.demo.findOneAndDelete({ name: "Charlie" });
排序
指定要排序的字段及排序顺序。
- 1 表示升序
- -1 表示降序。
js
// 按 age 字段升序排序
db.myCollection.find().sort({ age: 1 });
文档关联
文档间可以通过嵌入和引用来建立联系。
MongoDB 中的关系可以是:
- 1:1 (1 对 1)
- 1: N (1 对多)
- N: 1 (多对 1)
- N: N (多对多)
引用:
js
// 假设我们有两个集合:users 和 posts
db.users.insertOne({ _id: 1, name: "jty" });
db.posts.insertOne({ _id: 101, authorId: 1, content: "Hello, MongoDB!" });
// 查询用户及其发布的帖子
const user = db.users.findOne({ _id: 1 });
const posts = db.posts.find({ authorId: 1 });
// 在应用层合并结果
console.log(
user.name,
posts.map((post) => post.content)
);
五:Mongoose 使用
先介绍下 mongoose 的一些概念、然后以常见功能开发,来举例实现一些 api 介绍,如子文档嵌套、关联查询、查询密码隐藏、默认值设置、MD5 加密、文档数组更新
5.1 Mongoose 介绍
Mongoose 中的一切都始于
结构(Schema)
,没有模型有一个默认 Id_id
, 他是ObjectId()
类型的
模型(Model)
是从 Schema 定义编译而来的奇特构造函数, 模型的一个实例称为 document。模型负责从底层 MongoDB 数据库创建和读取文档。
5.2 安装
js
npm install mongoose --save
5.3 引入
js
const mongoose = require("mongoose");
5.4 建立链接
js
await mongoose.connect("mongodb://127.0.0.1:27017/test");
// 添加用户认证
await mongoose.connect(
"mongodb://root:123456@localhost:8017/test?authSource=admin"
);
5.5 创建模式
js
const UserSchema = new mongoose.Schema({
name: String,
});
5.6 创建模型
js
const User = mongoose.model("User", UserSchema);
5.7 查询数据库, 查看已什么开头的名字
js
await User.find();
await User.find({ name: /^fluff/ });
5.8 增删查改
通过对模型的操作,可以完成增删查改
增
js
// <!-- 构建文档 -->
const user = new User({ name: "jty" });
console.log(user.name); // ''
// <!-- 保存进数据库 -->
await user.save();
// 或者下面的方式
await User.create({ name: "jty" });
await User.insertMany([{ name: "jty" }]);
删
js
await User.deleteOne({ name: "jtt" });
查
js
await User.find({}); // 查询全部
await User.find({ name: /^jty/ }); // 正则查询
await User.findOne({ name: "jty", age: { $gte: 18 } }).exec(); // 条件查询
改
js
await Tank.updateOne({ name: "jty" }, { name: "jtt" });
await Tank.updateMany({ name: "jty" }, { name: "jtt" });
六:备份 、恢复数据
- 使用
mongodump
工具备份 MongoDB 数据库。 - 使用
mongorestore
工具恢复备份的数据。
七:结语
MongoDB 是一个功能强大的 NoSQL 数据库,适用于各种规模的应用。本文提供了 MongoDB 的基础知识和一些高级特性,帮助你快速上手 MongoDB 和 使用 mongoose 进行 Node 后端开发 , 更多特性建议阅读官方文档,并实践不同的操作和配置。