一、简介
1.1 MongoDB 是什么
MongoDB 是一个基于分布式文件存储的数据库,官方地址:www.mongodb.com/zh-cn
1.2 数据库是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序
1.3 数据库的作用
数据库的主要作用就是管理数据,对数据进行增(c)、删(d)、改(u)、查(r)
1.4 数据库 管理数据的特点
相比于纯文件管理数据,数据库管理数据有如下特点:
- 速度更快
- 扩展性更强
- 安全性更强
1.5 为什么选择 MongoDB
操作语法与 javascript 类似,容易上手,学习成本低
二、核心概念
MongoDB 中有三个重要概念需要掌握
- 数据库(DataBase)数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合
- 集合(collection)集合类似于 JS 中的数组,在集合中可以存放很多文档
- 文档(document) 文档是数据库中的最小单位,类似于 JS 中的对象
通过 JSON 文件来理解 MongoDB 中的概念
- 一个 JSON 文件好比是一个数据库,一个 MongoDB 服务下可以有 N 个数据库
- JSON 文件中的一级属性的数组值好比是集合
- 数组中的对象好比是文档
- 对象中的属性有时也称之为字段
一般情况下
- 一个项目使用一个数据库
- 一个集合会存储同一种类型的数据
三、下载与安装
下载地址:www.mongodb.com/try/downloa…
windows ⬇️
建议选择zip类型,通用性更强
配置步骤:
- 将压缩包移动到 C:\Program Files 下,然后解压
- 创建 C:\data\db 目录,mongodb 会将数据默认保存在这个文件夹
- 以 mongodb 中 bin 目录作为工作目录,启动命令行
- 运行命令 mongod
看到最后的 waiting for connections 则说明服务已经启动了 可以使用 mongo 命令连接本机的 mongodb 服务
- 为了方便后续方便使用 mongod 命令,可以将 bin 目录配置到环境变量path中
- 千万不要选中服务端窗口的内容,选中会停止服务,可以敲回车取消选中
mac ⬇️
- 解压重命名
- 将重命名后的 mongodb 文件移动到 /usr/local 目录下
3. 配置环境变量
打开 .zshrc 文件
// 没有就创建一个
touch .zshrc // 创建
open .zshrc // 打开
把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中
export PATH=${PATH}:/usr/local/mongodb/bin
编辑完成后保存并退出,然后使用source .zshrc命令使配置立即生效。
// 查询版本号及配置信息
mongod -version
- 创建日志及数据目录
在 /usr/local/mongodb 目录下新建两个文件夹 data 和 log,用于存储 MongoDB 的数据和日志。
打开终端
// 进入 mongodb 文件
cd /usr/local/mongodb
// 创建 data log 两个文件夹
mkdir data log
// 配置读写权限
sudo chown xxx /usr/local/mongodb/data
sudo chown xxx /usr/local/mongodb/log
// xxx 为系统用户名
5. 启动
// 在终端输入
mongod --fork -dbpath data --logpath log/mongo.log --logappend
参数说明
- -dbpath 用来设置数据的存放目录
- -logpath 用来设置日志的存放目录
- -fork 用来设置在后台运行
浏览器打开 http://127.0.0.1:27017/ 如下图即以成功启动
或者重新打开一个终端,输入 mongo ,出现如下界面则证明已从终端进入mongodb
6.0 以上版本 mongo 指令如果报「zsh: command not found: mongo」 进入mongodb/bin时会发现不存在mongo文件,这个时候可以去mongodb的官网下载5.0版本的mongodb解压之后进入bin文件将mongo文件复制到mongodb/bin文件内,然后尝试mongo就会发现问题已经被解决。
- 关闭
use admin 回车
db.shutdownServer()
不要直接关闭终端,直接关闭终端后会导致无法发启动 mongodb 如果不小心直接关闭了终端进入 ,在/usr/local/mongodb/data中找到mongod.lock文件删除掉,在终端输入sudo mongod --dbpath /usr/local/mongodb --logpath /usr/local/mongodb/log/mongo.log,重新启动mongodb即可
每次启动 mongodb 都要输入很长的指令有点麻烦
可以使用配置文件的方式来启动
在根目录下新建一个conf文件夹,并新建一个mongod.conf,配置内容如下:
# 数据库路径
dbpath=/usr/local/mongodb/data
# 日志输出文件路径
logpath=/usr/local/mongodb/log/mongo.log
# 错误日志采用追加模式
logappend=true
# 启用日志文件,默认启用
journal=true
# 过滤一些无用的日志信息,若需要调试设置为false
# quite=true
# 端口号 默认为27017
port=27017
# 是否需要校验,测试环境可以关闭,生产环境则需要打开
# auth=true
# 注册服务,这样就可以保证电脑启动服务就可以使用,避免每次关闭后还需要重新启动服务
fork=true
然后使用配置文件启动
mongod --config /usr/local/mongodb/conf/mongo.conf
成功提示
再使用 mongo 命令连接服务即可
四、命令行交互
命令行交互一般是学习数据库的第一步,不过这些指令在后续用的比较少,所以了解即可
4.1 数据库命令
- 显示所有的数据库
show dbs
- 切换到指定的数据库,如果数据库不存在会自动创建数据库
use 数据库名
- 显示当前所在的数据库
db
- 删除当前数据库
use 库名
db.dropDatabase()
4.2 集合命令
- 创建集合
db.createCollection('集合名称')
- 显示当前数据库中的所有集合
show collections
- 删除某个集合
db.集合名.drop()
- 重命名集合
db.集合名.renameCollection('newname')
4.3 文档命令
- 插入文档
db.集合名.insert(文档对象)
- 查询文档
db.集合名.find(查询条件)
_id是 mongodb 自动生成的唯一编号,用来唯一表述文档
3. 更新文档
db.集合名.update(查询条件, 新的文档)
db.集合名.update({name: '张三'}, {$set: {age:19}})
// 如果 db.集合名.update({name: '张三'}, {age:19}) 全部数据更新 name 会消失
- 删除文档
db.集合名.remove(查询条件)
4.4 应用场景
4.4.1 新增
- 用户注册
- 发布视频
- 发布商品
- 发朋友圈
- 发评论
- 发微博
- ...
4.4.2 删除
- 删除评论
- 删除商品
- 删除视频
- 删除微博
- ...
4.4.3 更新
- 更新个人信息
- 修改商品价格
- 修改文章内容
- ...
4.4.4 查询
- 商品列表
- 视频列表
- 微博列表
- 搜索功能
- ...
五、Mongoose
5.1 介绍
Mongoose 是一个对象文档模型库,官网 www.mongoosejs.net/
5.2 作用
方便使用代码操作 mongodb 数据库
5.3 使用流程
// 1、安装 mongoose
// 2、导入 mongoose
const mongoose = require('mongoose');
// 设置 strictQuery 为 true
mongoose.set('strictQuery', true);
// 3、连接 mongoose 数据库名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4、设置回调
// 连接成功的回调 once 事件回调只执行一次
mongoose.connection.once('open', () => {
// 创建新文档操作
// 创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象 对文档操作的封装对象
let BookModel = mongoose.model('books', BookSchema);
// 新增
// 6.x之前 BookModel.create({}, (err, data)=>{})
// 6.x 用 .then .catch 处理数据及失败
BookModel.create({
name: '西游记',
author: '吴承恩',
price: 99.9
}).then(data => {
console.log(data);
}).catch(err=>{
console.log('错了错了');
});
});
// 连接错误的回调
mongoose.connection.on('error', () => {
console.log('连接失败');
});
// 连接关闭的回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
});
// 关闭 mongoose 的连接
// setTimeout(()=>{
// mongoose.disconnect();
// }, 2000)
5.4 字段类型
文档结构可选的常用字段类型列表
| 类型 | 描述 |
|---|---|
| String | 字符串 |
| Number | 数字 |
| Boolean | 布尔值 |
| Array | 数组,也可以使用[]来标识 |
| Date | 日期 |
| Buffer | Buffer 对象 |
| Mixed | 任意类型,需要使用mongoose.Schema.Types.Mixed指定 |
| ObjectId | 对象ID,需要使用mongoose.Schema.Types.ObjectId指定 |
| Decimal128 | 高精度数字需要使用mongoose.Schema.Types.Decimal128指定 |
5.5 字段值验证
Mongoose 有一些内建验证器,可以对字段值进行验证
5.5.1 必填项
title: {
type: String,
required: true // 设置必填
}
5.5.2 默认值
author: {
type: String,
required: '匿名' // 设置默认值
}
5.5.3 枚举值
gender: {
type: String,
required: ['男', '女'] // 设置的值必须是数组中的
}
5.5.4 唯一值
username: {
type: String,
unique: true
}
unique 要重建集合才能有用
5.6 文档操作
// 1、安装 mongoose
// 2、导入 mongoose
const mongoose = require('mongoose');
// 设置 strictQuery 为 true
mongoose.set('strictQuery', true);
// 3、连接 mongoose 数据库名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4、设置回调
// 连接成功的回调 once 事件回调只执行一次
mongoose.connection.once('open', () => {
// 创建新文档操作
// 创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象 对文档操作的封装对象
let BookModel = mongoose.model('books', BookSchema);
//文档相关操作
xxx见下文
});
// 连接错误的回调
mongoose.connection.on('error', () => {
console.log('连接失败');
});
// 连接关闭的回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
});
// 关闭 mongoose 的连接
// setTimeout(()=>{
// mongoose.disconnect();
// }, 2000)
5.6.1 新增
// 新增
BookModel.create({
name: '三国演义',
author: '罗贯中',
price: 99.9
}).then(data => {
console.log(data);
}).catch(err=>{
console.log('错了错了');
});
5.6.2 删除
// 删除 单条
BookModel.deleteOne({_id: '6552166b70983c64c7fb1f36'}).then(data => {
console.log(data);
}).catch(err => {
console.log('删除失败');
});
// 批量删除
BookModel.deleteMany({name: '西游记'}).then(data => {
console.log(data);
}).catch(err => {
console.log('删除失败');
});
5.6.3 更新
// 更新文档 一条
// 参数 查询条件, 修改内容
BookModel.updateOne({ name: '西游记' }, {price: 9.9}).then(data => {
console.log(data);
}).catch(err => {
console.log('更新失败');
});
// 批量更新
BookModel.updateMany({ name: '水浒传' }, { price: 9.9 }).then(data => {
console.log(data);
}).catch(err => {
console.log('更新失败');
});
5.6.4 读取
// 读取文档 单条
BookModel.findOne({ name: '西游记' }).then(data => {
console.log(data);
}).catch(err => {
console.log('读取失败');
});
// 根据ID获取文档
BookModel.findById('65523f07e735dcdaa4b8e36d').then(data => {
console.log(data);
}).catch(err => {
console.log('读取失败');
});
// 批量读取 有条件
BookModel.find({ name: '西游记' }).then(data => {
console.log(data);
}).catch(err => {
console.log('读取失败');
});
// 无条件
BookModel.find().then(data => {
console.log(data);
}).catch(err => {
console.log('读取失败');
});
5.7 条件控制
5.7.1 运算符
在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号
>使用$gt<使用$lt>=使用$gte<=使用$lte!==使用$ne
// id号比3大大所有的记录
db.students.find({id:{$gt:3}});
5.7.2 逻辑运算
$or 逻辑或
db.students.find({$or:[{age:18}, {age: 20}]});
$and 逻辑与
db.students.find({$and:[{age: {$lt:20}}, {age: {$gt: 15}}]});
5.7.3 正则匹配
条件中可以直接使用js的正确语法,通过正则可以进行模糊查询
db.students.find({name: /三/});
db.students.find({ name: new RegExp('三') });
5.8 个性化读取
5.8.1 字段筛选
// 0: 不要的字段
// 1: 要的字段
// 6.x 前
BookModel.find().select({name: 1, author: 1}).exec((err, data)=>{})
// 6.x 后
BookModel.find().select({name: 1, author: 1, _id: 0}).then(data => {
console.log(data)
}).catch(err => {
console.log('读取失败');
});
5.8.2 数据排序
// sort 排序
// 1: 升序
// -1: 降序
BookModel.find().sort({price: 1}).then(data => {
console.log(data)
}).catch(err => {
console.log('读取失败');
});
5.8.3 数据截取
// 跳过前三条,取三条(4-6条)
BookModel.find().skip(3).limit(3).then(data => {
console.log(data)
}).catch(err => {
console.log('读取失败');
});
六、图形化工具
使用图形化的管理工具来对 MongoDB 进行交互
- Robo 3T 免费
mac: studio3t.com/download/
windows: github.com/studio3t/ro… - Navicat 收费 www.navicat.com.cn/