MongoDB
简介
MongoDB是什么
MongoDB是一个基于分布式文件存储的数据库
数据库是什么
按照数据结构组织、存储数据的一种应用程序
数据库的作用
数据库的主要作用管理数据
,对数据进行增删改查
数据库管理数据的特点
相比纯文件管理数据,数据库管理具有如下特点:
- 速度快
- 拓展性强:当数据量增大时,可以创建多个数据库
- 安全性更强:数据加密存储、身份校验
为什么选择MongoDB
操作语法和JavaScript类似,易上手
MongoDB核心概念
MongoDB中有三个概念需要掌握:
-
数据库(database):数据库服务下可以创建很多数据库,数据库中存放很多集合
-
集合(collection):
集合类似于JS中的数组
,在集合中可以存放很多文档 -
文档(document):
文档是数据库中的最小单位,类似于JS中的对象
可以通过JSON文件来理解MongoDB中的概念
一个JSON文件
好比一个MongoDB的数据库
,一个MongoDB服务下可以有N个数据库- JSON文件中的
一级属性的数组值
好比是MongoD集合
-
JSON文件中
数组中的对象
好比是MongoDB文档
- 对象中的属性有时候也称为
字段
一般情况下
- 一个项目使用一个数据库
- 一个集合会存储同一种类型的数据;比如账单集合、用户集合
安装MongoDB
mongod启动服务器服务
mongo启动客户端
上述两个命令需要在两个cmd窗口中运行,且必须先启动服务器
为了方便后续mongod命令的使用,可以将bin目录配置到环境变量
千万不要选中服务端窗口的内容
,选中会停止服务,可以敲回车
取消选中
数据库与集合命令
命令行 交互是学习的第一步,不过这些命令在后续用的较少。
数据库命令
# 显示所有数据库
show dbs
# 切换数据库到指定库,如果没有则创建
use 数据库名
# 显示当前数据库
db
# 删除当前数据库
use 库名
db.dropDatabase()
集合命令
# 显示当前数据库所有集合
show collections
# 创建集合
db.craeteCollection('集合名称')
# 删除某个集合
db.集合名.doop()
# 重命名集合
db.集合名.renameCollection('newname')
文档命令
# 插入文档
db.集合名.insert(文档对象)
# 查询文档
db.集合名.find(查询条件)
# 更新文档
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}}) # $set可以保证值修改age属性,而不是覆盖整个
# 删除文档
db.集合名.remove(查询条件)
应用场景
新增
删除
伪删除
在文档里面添加属性,true false表示这个文档是否删除
好处:用户不小心误操作,可以恢复
更新
查询
Mongoose
mongoose是一个包,使用npm命令安装
可以方便使用代码操作mongodb数据库
基础使用操作
// 安装mongooose
// 导入mongooose
const mongoose = require('mongoose')
// 连接mongodb数据库
mongoose.connect('mongodb://127.0.0.1:27017/bilibili') // 如果不存在这个数据库会自动创建
// 设置回调
// 连接成功;官方推荐用once而不是用on
// once:事件只执行一次
mongoose.connection.once('open',()=>{
console.log('连接成功');
})
// 连接失败
mongoose.connection.on('error',()=>{
console.log('连接失败');
})
// 连接关闭
mongoose.connection.on('close',()=>{
console.log('连接关闭');
})
// 关闭mogodb连接
setTimeout(()=>{
mongoose.disconnect()
},2000)
once是防止数据库掉线重连的情况,因为连接数据库和一般都结合很多功能代码,重新运行可能有问题
字段类型
文档id:作用外键 存储另外一个文档的id
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔 |
Array | 数组,也可以使用[]来标识 |
Date | 日期 |
Buffer | Buffer对象 |
Mixed | 任意类型,需要使用 mongoose.Schema.Types.Mixed 指定 |
Objected | 文档对象ID,需要使用 mongoose.Schema.Types.ObjectId 指定 |
Decimal128 | 高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定 |
字段验证
字段验证:对字段值进行验证
# 在文档对象结构中设置
# 字段必填
字段名:{
type:xxx,
required:true # 设置必填
}
# 默认值
字段名:{
type:xxx,
default:xxx
}
# 枚举值
字段名:{
type:xxx,
enum:['a',...,'b']
}
# 唯一值
字段名:{
type:xxx,
unqiue:true
}
unqiue使用,必须重建集合(或者是一个新集合),在旧的集合上新添加这个操作没有用。
增删改查
细节:mongoose会使用集合名称的复数来创建集合,自动变成复数形式。
条件控制
如何设置查询文档的条件,之前都是等于条件。
没写代码
https://www.bilibili.com/video/BV1gM411W7ex?p=145&vd_source=dde2f4dd432156027fedf9b1734ba705
运算符
逻辑运算
正则匹配
个性化读取
字段筛选
select
默认返回全部的字段;有时候只读取某些属性,相当于mysql中的select字段
_id默认会返回,就算在select不设置为1也会返回,需要显式设置为0才会不显示;
数据排序
sort
升序1
导入0
数据截取
limit
limit(n) 取前n
skip(m).limit(n)取m-n的数据‘
skip常用来分页
后端取一点数据前端渲染一点,用户发送了请求再取下面的数据
Mongoose代码模块化
将代码拆分
https://www.bilibili.com/video/BV1gM411W7ex?p=147&spm_id_from=pageDriver&vd_source=dde2f4dd432156027fedf9b1734ba705
第二个模块化非常重要
图形化管理工具
操作mongodb数据库的三种方法