文章目录
1 简介
1.1 MongoDB是什么
MongoDB是一个基于分布式文件存储的数据库,官方地址:https://www.mongodb.com/。
1.2 数据库是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序。
1.3 数据库的作用
数据库的主要作用就是管理数据,对数据进行增(c)、删(d)、改(u)、查(r)。
1.4 数据库管理数据的特点
相比于纯文件管理数据,数据库管理数据有如下特点:速度更快、扩展性更强、安全性更强。
1.5 为什么选择MongoDB
操作语法与JavaScript类似,容易上手,学习成本低。
2 核心概念
MongoDB中有三个重要概念需要掌握:
- 数据库(database)数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合。
- 集合(collection)集合类似于JS中的数组,在集合中可以存放很多文档。
- 文档(document)文档是数据库中的最小单位,类似于JS中的对象。 JSON文件示例:
{"accounts":[{"id":"3-YLju5f3","title":"买电脑","time":"2023-02-08","type":"-1","account":"5500","remarks":"为了上网课"},{"id":"mRQiD4s3K","title":"发工资","time":"2023-02-19","type":"1","account":"14396","remarks":"终于发工资啦!~~"}],"users":[{"id":1,"name":"zhangsan","age":18},{"id":2,"name":"lisi","age":20}]}
可以通过JSON文件来理解MongoDB中的概念:
- 一个JSON 文件好比是一个数据库,一个MongoDB服务下可以有N个数据库。
- JSON文件中的一级属性的数组值好比是集合。
- 数组中的对象好比是文档。
- 对象中的属性有时也称之为字段。
- 一般情况下: 一个项目使用一个数据库。 一个集合会存储同一种类型的数据。
3 下载安装与启动
下载地址:https://www.mongodb.com/try/download/community,建议选择 zip 类型, 通用性更强。
配置步骤如下:
- 将压缩包移动到C:\Program Files下,然后解压。
- 创建C:\data\db目录,mongodb会将数据默认保存在这个文件夹。
- 以mongodb中 bin目录作为工作目录,启动命令行。
- 运行命令
mongod
。 - 看到最后的" waiting for connections "则表明服务已经启动成功。
- 然后可以使用
mongo
命令连接本机的mongodb服务。
注意:
- 为了方便后续使用mongod命令,可以将bin目录配置到环境变量Path中。
- 千万不要选中服务端窗口的内容,选中会停止服务,可以敲回车取消选中。
4 命令行交互
命令行交互一般是学习数据库的第一步,不过这些命令在后续用的比较少,所以大家了解即可。
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自动生成的唯一编号,用来唯一标识文档。 - 更新文档:
db.集合名.update(查询条件,新的文档)``````db.集合名.update({name:'张三'},{$set:{age:19}})
- 删除文档:
db.集合名.remove(查询条件)
。
4.4 应用场景
4.4.1 新增
- 用户注册
- 发布视频
- 发布商品
- 发朋友圈
- 发评论
- 发微博
- 发弹幕
- …
4.4.2 删除
- 删除评论
- 删除商品
- 删除文章
- 删除视频
- 删除微博
- …
4.4.3 更新
- 更新个人信息
- 修改商品价格
- 修改文章内容
- …
4.4.4 查询
- 商品列表
- 视频列表
- 朋友圈列表
- 微博列表
- 搜索功能
- …
5 Mongoose
5.1 介绍
Mongoose是一个对象文档模型库,官网:http://www.mongoosejs.net/。
5.2 作用
方便使用代码操作MongoDB数据库。
5.3 连接数据库
//1. 安装 mongoose//2. 导入 mongooseconst mongoose =require('mongoose');//设置 strictQuery 为 true,处理禁用警告
mongoose.set('strictQuery',true);//3. 连接 mongodb 服务 mongodb协议 默认端口号27017 数据库的名称(如果数据库不存在,自动创建)
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');//4. 设置回调// 设置连接成功的回调 once 一次 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
console.log('连接成功');// app.listen(8080);});// 设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');});//设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');});//关闭 mongodb 的连接// setTimeout(() => {// mongoose.disconnect();// }, 2000)
5.4 创建新文档
//4. 设置回调// 设置连接成功的回调 once 一次 事件回调函数只执行一次
mongoose.connection.once('open',()=>{//5. 创建文档的结构对象//设置集合中文档的属性以及属性值的类型let BookSchema =newmongoose.Schema({name: String,author: String,price: Number
});//6. 创建模型对象 对文档操作的封装对象,mongoose.model(集合名称,结构对象)let BookModel = mongoose.model('books', BookSchema);//7. 新增
BookModel.create({name:'西游记',author:'吴承恩',price:19.9},(err, data)=>{//判断是否有错误if(err){
console.log(err);return;}//如果没有出错, 则输出插入后的文档对象
console.log(data);//data 插入成功后的文档对象,mongodb自定生成编号和版本号//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
mongoose.disconnect();});});
5.5 字段类型
文档结构可选的常用字段类型列表。
类型描述String字符串Number数字Boolean布尔值Array数组,也可以使用 [ ] 来标识Date日期BufferBuffer 对象Mixed任意类型,需要使用 mongoose.Schema.Types.Mixed 指定ObjectId对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定Decimal128高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定
/**
* 存储图片、视频等资源时,会将其存在静态资源文件夹下,
* 把资源对应的的url以字符串的形式存在数据库中,将来再用时,
* 直接到静态资源文件夹中根据url查找对应的资源即可,
* 所以很少将图片存入数据库中。
*///4. 设置回调// 设置连接成功的回调 once 一次 事件回调函数只执行一次
mongoose.connection.once('open',()=>{//5. 创建文档的结构对象//设置集合中文档的属性以及属性值的类型let BookSchema =newmongoose.Schema({name: String,author: String,price: Number,is_hot: Boolean,tags: Array,pub_time: Date,test: mongoose.Schema.Types.Mixed
//test: mongoose.Schema.Types.ObjectId // 文档 ID,一般做外键(做联合查询)});//6. 创建模型对象 对文档操作的封装对象let BookModel = mongoose.model('books', BookSchema);//7. 新增
BookModel.create({name:'西游记',author:'吴承恩',price:19.9,is_hot:true,tags:['鬼怪','励志','社会'],pub_time:newDate(),test:newDate()},(err, data)=>{//判断是否有错误if(err){
console.log(err);return;}//如果没有出错, 则输出插入后的文档对象
console.log(data);//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
mongoose.disconnect();});});
5.6 字段值验证
Mongoose有一些内建验证器,可以对字段值进行验证。
/**
* 字段验证:对文档属性的值进行校验,检查通过就插入数据库,如果不合法就禁止插入
* unique 需要重建集合才能有效果
*///设置集合中文档的属性以及属性值的类型let BookSchema =newmongoose.Schema({name:{type: String,required:true,// 设置必填项 // 表明该属性必须不为空unique:true// 设置为独一无二的,唯一值},author:{type: String,default:'匿名'//默认值},//类型style:{type: String,//枚举enum:['言情','城市','志怪','恐怖']//设置的值必须是数组中的},price: Number
});
5.7 增删改查
数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)。
5.7.1 增加
- 插入一条数据:
SongModel.create({title:'给我一首歌的时间',author:'Jay'},function(err, data){//错误
console.log(err);//插入后的数据对象
console.log(data);});
- 批量插入数据:
PhoneModel.insertMany([{brand:'华为',color:'灰色',price:2399,tags:['电量大','屏幕大','信号好']},{brand:'小米',color:'白色',price:2099,tags:['电量大','屏幕大','信号好']}],(err,data)=>{if(err)throw err;
console.log('写入成功');
mongoose.connection.close();})
5.7.2 更新
- 更新一条数据:
SongModel.updateOne({author:'JJ Lin'},{author:'林俊杰'},function(err){if(err)throw err;
mongoose.connection.close();});
- 批量更新数据:
SongModel.updateMany({author:'Leehom Wang'},{author:'王力宏'},function(err){if(err)throw err;
mongoose.connection.close();});
5.7.3 删除
- 删除一条数据:
SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'},function(err){if(err)throw err;
console.log('删除成功');
mongoose.connection.close();});
- 批量删除数据:
SongModel.deleteMany({author:'Jay'},function(err){if(err)throw err;
console.log('删除成功');
mongoose.connection.close();});
5.7.4 查询
- 查询一条数据:
SongModel.findOne({author:'王力宏'},function(err, data){if(err)throw err;
console.log(data);
mongoose.connection.close();});//根据 id 查询数据
SongModel.findById('5dd662b5381fc316b44ce167',function(err, data){if(err)throw err;
console.log(data);
mongoose.connection.close();});
- 批量查询数据:
//不加条件查询,读取所有
SongModel.find(function(err, data){if(err)throw err;
console.log(data);
mongoose.connection.close();});//加条件查询,批量读取
SongModel.find({author:'王力宏'},function(err, data){if(err)throw err;
console.log(data);
mongoose.connection.close();});
5.8 条件控制
5.8.1 运算符
在mongodb不能 > < >= <= !== 等运算符,需要使用替代符号
运算符替代符号>$gt<$lt>=$gte<=$lte!==$ne
//价格小于 20 的图书
BookModel.find({price:{$lt:20}},(err, data)=>{if(err){
console.log('读取失败~~');return;}
console.log(data);})
5.8.2 逻辑运算
- $or:逻辑或
- $and:逻辑与
//曹雪芹 或者 余华的书
BookModel.find({$or:[{author:'曹雪芹'},{author:'余华'}]},(err, data)=>{if(err){
console.log('读取失败~~');return;}
console.log(data);})//价格大于 30 且小于 70
BookModel.find({$and:[{price:{$gt:30}},{price:{$lt:70}}]},(err, data)=>{if(err){
console.log('读取失败~~');return;}
console.log(data);})
5.8.3 正则匹配
条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询。
//正则表达式, 搜索书籍名称中带有 `三` 的图书
BookModel.find({name:/三/},(err, data)=>{if(err){
console.log('读取失败~~');return;}
console.log(data);})//正则表达式的这种定义形式能够解析变量的值
BookModel.find({name:newRegExp('三')},(err, data)=>{if(err){
console.log('读取失败~~');return;}
console.log(data);})
5.9 个性化读取
5.9.1 字段筛选
//0:不要的字段//1:要的字段
BookModel.find().select({name:1,author:1,_id:0}).exec((err, data)=>{if(err){
console.log('查询失败~~');return;}
console.log(data);})
5.9.2 数据排序
//sort 排序//1:升序//-1:倒序
BookModel.find().select({name:1,price:1,_id:0}).sort({price:-1}).exec((err, data)=>{if(err){
console.log('查询失败~~');return;}
console.log(data);})
5.9.3 数据截取
//skip 跳过 limit 限定//数据的截取,跨过3个取3个
BookModel.find().select({name:1,price:1,_id:0}).sort({price:-1}).skip(3).limit(3).exec((err, data)=>{if(err){
console.log('查询失败~~');return;}
console.log(data);})
6 图形化管理工具
我们可以使用图形化的管理工具来对Mongodb进行交互,这里给出两个图形化工具:
- Robo 3T:免费,https://github.com/Studio3T/robomongo/releases。
- Navicat:收费,https://www.navicat.com.cn/。
7 mongoose模块化
- config.js:
//配置文件
module.exports ={DBHOST:'127.0.0.1',DBPORT:27017,DBNAME:'bilibili'}
- db.js:
/**
*
* @param {*} success 数据库连接成功的回调
* @param {*} error 数据库连接失败的回调
*/
module.exports=function(success, error){//判断 error 为其设置默认值if(typeof error !=='function'){error=()=>{
console.log('连接失败~~~');}}//1. 安装 mongoose//2. 导入 mongooseconst mongoose =require('mongoose');//导入 配置文件const{DBHOST,DBPORT,DBNAME}=require('../config/config.js');//设置 strictQuery 为 true
mongoose.set('strictQuery',true);//3. 连接 mongodb 服务 数据库的名称
mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);//4. 设置回调// 设置连接成功的回调 once 一次 事件回调函数只执行一次
mongoose.connection.once('open',()=>{success();});// 设置连接错误的回调
mongoose.connection.on('error',()=>{error();});//设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');});}
- BookModel.js:
//导入 mongooseconst mongoose =require('mongoose');//创建文档的结构对象//设置集合中文档的属性以及属性值的类型let BookSchema =newmongoose.Schema({name: String,author: String,price: Number
});//创建模型对象 对文档操作的封装对象let BookModel = mongoose.model('books', BookSchema);//暴露模型对象
module.exports = BookModel;
- index.js:
//导入 db 文件const db =require('./db/db');//导入 mongooseconst mongoose =require('mongoose');//导入 BookModelconst BookModel =require('./models/BookModel');// 调用函数db(()=>{//7. 新增
BookModel.create({name:'西游记',author:'吴承恩',price:19.9},(err, data)=>{//判断是否有错误if(err){
console.log(err);return;}//如果没有出错, 则输出插入后的文档对象
console.log(data);//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
mongoose.disconnect();});},()=>{
console.log('连接失败...');});
版权归原作者 子非鱼921 所有, 如有侵权,请联系我们删除。