mongoDB
介绍
- MongoDB是一个基于分布式文件存储的
数据库
,官方地址https://www.mongodb.com
(Mongodb操作语法与JavaScript类似,容易上手,学习成本低) - 数据库(DataBase)是按照数据结构来组织、存储和管理数据的
应用程序
- 数据库的主要作用就是
管理数据
,对数据进行增(c)、删(d)、改(u)、查(r)
- 数据库管理数据的特点:(相比于纯文件管理数据)1.速度更快2.扩展性更强3.安全性更强
三个重要概念
下载
下载地址:https://www.mongodb.com/try/download/community
如果下载版本高于5.0在官网手动下载mong shell配置文件,将shell文件的.exe和.dll文件复制到bin文件内,最后执行mongsh就可以了
数据库与集合命令、应用场景
命令行交互一般是学习数据库的第一步,这些命令后续用的比较少,所以了解即可
应用场景
伪删除:在有些程序中不会把数据真正删除,而是对内容做一些标记(比如加一些属性is_deleted:true;true表示被删除,false表示未删除)
Mongoose
下载 npm i mongoose
- Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/
- 方便使用代码操作 mongodb 数据库
- 使用: 1.安装mongoose 2.导入mongoose
3.连接mongodb服务
4.设置回调 连接成功或者失败等可以做一些事情
5.创建文档的结构对象
6.创建模型对象
7.新增
8.关闭数据库连接(项目运行过程中,不会添加该代码)
操作示例
javascript
// 1.安装mongoose
// 2.导入mongoose
const mongoose=require('mongoose');
// 3.连接mongodb服务 数据库名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 4.设置回调 连接成功或者失败等可以做一些事情
//设置连接成功的回调 once一次 事件回调函数只执行一次
mongoose.connection.once('open',()=>{
console.log('连接成功');
// 5.创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型(schema有结构的意思)
let BookSchema=new mongoose.Schema({
name:String,
author:String,
prince:Number
});
// 6.创建模型对象 对文档操作的封装对象 (模型对象可以用来对数据进行操作,model()是其中的一个方法)
let BookModel=mongoose.model('books',BookSchema);
//(需要进行操作的集合名称,结构对象)
// 7.新增
BookModel.create({//创建新文档
name:'西游记',
author:'吴承恩',
price:19.9
}).then((err,data)=>{//新版本不支持该回调函数写法了而是会返回一个promise对象,把回调函数改写成.then
if(err){
console.log(err);
return;
}
// 如果没有出错,则输出插入后的文档对象
console.log(data);
// 8.关闭数据库连接(项目运行过程中,不会添加该代码)
mongoose.disconnect();
});
});
//设置连接错误的回调
mongoose.connection.on('error',()=>{
console.log('连接失败');
});
//设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
// // 关闭mongodb的连接
// setTimeout(()=>{
// mongoose.disconnect();
// },2000)
字段类型
字段值验证
Mongoose 有一些内建验证器,可以对字段值进行验证
javascript
必填项:
title: {
type: String,
required: true // 设置必填项
},
默认值:
author: {
type: String,
default: '匿名' //默认值
},
枚举值:
gender: {
type: String,
enum: ['男','女'] //设置的值必须是数组中的
},
唯一值:
username: {
type: String,
unique: true
},
unique 需要 重建集合 才能有效果
永远不要相信用户的输入
CURD
数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)
增加:
javascript
插入一条:
SongModel.create({
title:'给我一首歌的时间',
author: 'Jay'
}).then(data=>{
//插入后的数据对象
console.log(data);
mongoose.connection.close();
}.catch(err=>{
console.log(err);
});
批量插入:
.insertMany().then();
删除
javascript
删除一条:
SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'})
.then(/*和上面then()中的一样我省略了,下面也是*/).catch();
批量删除:
SongModel.deleteMany({author:'Jay'}).then().catch();
更新
javascript
更新一条:
SongModel.updateOne(
// 拿到需要更新的(不一定非要填一样)、更新为什么
{name: '红楼梦'}, {price: 9.9}).then().catch();//把名字为红楼梦的数据的价钱改为9.9)
批量更新:
SongModel.updateMany(
// 修改前、修改后
{author: 'Leehom Wang'},
{author: '王力宏'}).then();
查询
javascript
查询一条数据:
SongModel.findOne({author: '王力宏'}).then().catch();
//根据 id 查询数据
SongModel.findById('5dd662b5381fc316b44ce167').then().catch();
批量查询数据:
//不加条件查询
SongModel.find().then().catch();
//加条件查询
SongModel.find({author: '王力宏'}).then().catch();
mongoose条件控制
如何去设置查询文档的条件
运算符
在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号
javascript
> 使用 $gt
< 使用 $lt
>= 使用 $gte
<= 使用 $lte
!== 使用 $ne
示例:db.students.find({id:{$gt:3}});
id号比3大的所有的记录
逻辑运算
$or 逻辑或的情况
javascript
db.students.find({$or:[{age:18},{age:24}]});
$and 逻辑与的情况
javascript
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]})
正则匹配
条件中可以直接使用 JS 的正则语法,通过正则可以进行模糊查询
javascript
db.students.find({name:/imissyou/});
个性化读取
字段筛选
javascript
//0:不要的字段
//1:要的字段 不要id属性,保留title属性
SongModel.find().select({_id:0,title:1}).then();
数据排序
javascript
//sort 排序
//1:升序 //-1:倒序
SongModel.find().sort({hot:1}).then();
数据截取
skip
跳过 limit
限定
1.limit(3)取出前三个
2.skip(3)跳过前三个(不取前三个)常用于分页
javascript
SongModel.find().skip(3).limit(3).then();
代码模块化
把db、model分开
1.db.js
把db封装在一个函数里,设置参数
javascript
/**
* @param {*} success 数据库连接成功的回调
* @param {*} error 数据库连接失败的回调
*/
module.exports=function(success,error){
// 1.安装mongoose
// 2.导入mongoose
const mongoose=require('mongoose');
// 导入配置文件
const {DBHOST,DBPORT,DBNAME}=require('../config/config')
// 3.连接mongodb服务 数据库名称
// mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);
// 4.设置回调 连接成功或者失败等可以做一些事情
//设置连接成功的回调 once一次 事件回调函数只执行一次
mongoose.connection.once('open',success);
//设置连接错误的回调
mongoose.connection.on('error',error);
//设置连接关闭的回调
mongoose.connection.on('close',()=>{
console.log('连接关闭');
});
}
2.mongodb服务可能会变化不方便后续修改,创建文件config,把服务端口做成配置项。
config.js
javascript
// 配置文件
module.exports={
DBHOST:'127.0.0.1',
DBPORT:27017,
DBNAME:'bilibili',
}
3.把model单独放一个文件并暴露出去
javascript
const mongoose=require('mongoose');
// 5.创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型(schema有结构的意思)
let BookSchema=new mongoose.Schema({
name:String,
author:String,
prince:Number
});
// 6.创建模型对象 对文档操作的封装对象 (模型对象可以用来对数据进行操作,model()是其中的一个方法)
let BookModel=mongoose.model('books',BookSchema);//(需要进行操作的集合名称,结构对象)
module.exports=BookModel;
4.index.js
导入文件并传参(两个回调函数)
javascript
// 导入db文件
const db=require('./db/db');
// 导入BookModel文件
const BookModel=require('./models/BookModel');
// 调用函数
db(()=>{
// 7.新增
BookModel.create({//创建新文档
name:'西游记',
author:'吴承恩',
price:19.9
}).then(data=>{
console.log(data);
}).catch(err=>{
console.log('失败');
});
},()=>{
console.log('连接失败');
})
图形化管理工具
我们可以使用图形化的管理工具来对 Mongodb 进行交互,这里演示两个图形化工具
Robo 3T 免费 :https://github.com/Studio3T/robomongo/releases
Navicat 收费:
https://www.navicat.com.cn/