1.MongoDB 概述
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。
MongoDB 使用集合(collection)和文档(document)来描述和存储数据,集合(collection)就相当于表,文档(document)相当于行,字段相当于列,不像MySQL之类的关系型数据库,表结构是固定的,比如某一行由若干列组成,行行都一样,而 MongoDB 不同,一个集合里的多个文档可以有不同的结构,更灵活一些。
MongoDB 有自己很鲜明的特色,总结起来有以下 4 条:
1. 没有表结构的限制
传统 SQL 数据库中,对每张表都需要定义表结构。如果有新的存储需求,往往需要添加新的字段,更改表结构。在一些场景下,会显得很不方便。
而对于 MongoDB,这不再是问题。因为它没有表结构这个概念,在使用一张表之前,不需要对这张表进行任何初始化操作。MongoDB 的这种特性对快捷开发和多变的业务需求是很合适的。
2. 完全的索引支持
有些 NoSQL 数据库,比如 Redis,它是内存数据库,速度很快。但是,做为键值数据库,只支持一种按键查询的方式。灵活性、使用范围和易用性都受到影响。再比如 HBase,写入速度很快。但是,同样查询受限,它只支持单索引,二级索引需要自己实现。
而 MongoDB 支持单键索引、多键索引、全文索引和地理位置索引。所以 MongoDB 是功能非常完善的 NoSQL 数据库,也被称为最接近关系数据库的非关系数据库。
3. 良好的数据安全性和方便的规模扩展
MongoDB 使用复制集做多副本存储,以保证数据的安全性。
同时,MongoDB 内置的分片技术可以很方便地进行数据规模的扩展。分片技术是很新颖的一个特性,它包含了自动数据接口,动态扩容和缩容等一系列在其他数据库中需要大量人工操作的工作,同时提供了对数据库的统一访问入口,不需要在应用层再进行分发,显著减少了人工成本。
4. 完善的文档支持和驱动支持
2.MongoDB 安装
MongoDB官网下载地址:https://www.mongodb.com/try/download/community
- db:和mysql的概念一致
- collection:集合,类似于mysql中的表
- document:每个集合中的文档,类似于mysql中的记录
- Primary Key:和mysql中的主键含义一致,每个document都有一个主键
- field:文档中的字段
mongodb属于nosql中的文档型数据库,每个文档相当于是一个对象,它没有列的概念,也没有表关系
由于它是一个nosql数据库:
- 无sql语句
- 使用极其简单,学习成本非常低
- 由于没有集合之间的关联,难以表达复杂的数据关系
- 存取速度极快
由于它是一个文档型数据库:
- 数据内容非常丰富和灵活
- 对数据结构难以进行有效的限制
2.1可视化工具 Robo 3T
我们可以在 Robo 3T 的官网上下载到该软件,官网地址为:https://robomongo.org/
图标是为:
3.在vscode中操作
3.1mongoose 安装
使用 mongoose 首先需要保证已经安装好 node.js 和 mongodb。然后在项目根目录中通过以下命令安装 mongoose:
npm install mongoose
3.2连接 mongodb
这里使用学生和老师的管理系统作为例子解释:
安装好 mongoose 后,就可以在项目中通过 mongoose 提供的方法将项目与 mongodb 连接起来。代码如下:
//schoolconnect.js
let mongoose=require("mongoose");//引用mongoose的包
const studentURI = "mongodb://localhost:27017/school"; //找到本地的数据库
mongoose.connect(studentURI); //链接本地的数据库
mongoose.connection.on("connected",()=>{//判断是否链接成功,成功就是进入该箭头函数
console.log("学校链接已打开");
})
3.3建立班级和学生的Schema
Schema 是 mongoose 提供的一个方法,用来定义 mongodb 中对应的数据集合的结构。
这里是根据需求可以建立适合数量的Schema,之后将形成对应数量的module
学生的Schema如下:
//studentSchema.js
// 学生的信息规范
const mongoose = require("mongoose");
const Schema = mongoose.Schema;//引用mongoose里的Schema
const educationTypes = require("./studenteducation");//引入学生学历
let studentsSchema = new Schema({
studentNum: {
type: String,
index: true,//下标
unique: true,//唯一性
minlength: 1,//最小数
maxlength: 6,//最大值
trim: true,//左右空格
required:true//必填
},
studentName: {
type: String,
required: true,
trim: true,
select: false,//当被选中时 不显示出来
minlength: 2,
maxlength: 10,
},
tel: {
type: Number,
required: true,
trim: true,
minlength: 11,
maxlength: 11,
},
birthday:{
type:Date,
default:Date.now,//现在的时间
},
education:{
type:String,
enum:educationTypes,//学历选择
},
classid: {
type:Schema.Types.ObjectId,//与班级信息链接
required:true,
ref:"classModel" //要进行关联查询是引入关联的UserModel的名字,该名字是导出model的第一个参数的名字
},
}, { versionKey: false });
module.exports = mongoose.model("studentModel",studentsSchema,"student");
// - "studentModel":数据模型名称
// - studentsSchema 数据结构
// - "users":数据模型对应的数据库中的数据集合名称
老师的Schema如下:
// 班级的信息规范
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
let classSchema = new Schema({
className:{
type:String,
required:true,
minlength: 3,
maxlength: 5,
},
classType:{
type:String,
required:true,
default:"火箭班"
},
classTeacher:{
type:String,
},
});
module.exports = mongoose.model("classModel",classSchema,"class");
//studenteducation.js
module.exports=["大专", "本科", "研究生", "博士"];
//index.js
// 最终被外层dao使用
require("./schoolconnect");
let studentSchema= require("./studentSchema");
let teacherSchema= require("./teacherSchema");
module.exports.studentSchema=studentSchema;
module.exports.teacherSchema=teacherSchema;
Dao
//studentsDao.js
let { studentSchema } = require("../models/index");
// 添加
async function studentAdd(dogs) {
let result = await studentSchema.insertMany(dogs);
return result;
}
// 查找
async function find() {
let result = await studentSchema.find();
return result;
}
// 修改
async function studentupdate(id,dogs) {
let result = await studentSchema.updateMany({_id:id},dogs);//?????({_id:id}
return result;
}
// 删除
async function studentremove(id) {
let result = await studentSchema.remove({_id:id});
return result;
}
async function query(filter,page,limit = 5){
//分页公式 (page-1)*limit
let result = await studentSchema.find(filter).skip((page-1)*limit).limit(limit);
return result;
}
async function teacherpopulate(){
let result = await studentSchema
.find().populate("classid","classType classTeacher");
return result;
}
module.exports.teacherpopulate = teacherpopulate;
module.exports.studentAdd = studentAdd;
module.exports.find = find;
module.exports.studentupdate = studentupdate;
module.exports.studentremove = studentremove;
module.exports.query = query;
//teacherDao.js
let { teacherSchema } = require("../models/index");
// 添加
async function teacherAdd(dogs) {
let result = await teacherSchema.insertMany(dogs);
return result;
}
// 查找
async function find() {
let result = await teacherSchema.find();
return result;
}
// 修改
async function teacherupdate(id,dogs) {
let result = await teacherSchema.updateMany({_id:id},dogs);//?????({_id:id}
return result;
}
// 删除
async function teacherremove(id) {
let result = await teacherSchema.remove({_id:id});
return result;
}
module.exports.teacherAdd = teacherAdd;
module.exports.find = find;
module.exports.teacherupdate = teacherupdate;
module.exports.teacherremove = teacherremove;
outside
let studentsDao=require("./dao/studentsDao");
let teacherDao=require("./dao/teacherDao");
let studentsdata=require("./Mock/studentsMock");
let teacherMock=require("./Mock/teacherMock");
// console.log(studentsdata);
// 添加学生
// studentsDao.studentAdd(studentsdata).then(data => {
// console.log(data);
// })
// 添加班级
// teacherDao.teacherAdd(teacherMock).then(data => {
// console.log(data);
// })
// 查找学生
// studentsDao.find().then(data => {
// console.log(data);
// })
// 删除学生
// studentsDao.studentremove("624560e79f76a885cffcc1a7").then(data => {
// console.log(data);
// })
// 修改学生
// studentsDao.studentupdate("624560e79f76a885cffcc1a8", {
// "education" : "大专",
// }).then(data => {
// console.log(data);
// })
// 查找老师
// teacherDao.find().then(data => {
// console.log(data);
// })
// 删除老师
// teacherDao.teacherremove("6245633e5b525cdff21827eb").then(data => {
// console.log(data);
// })
// 修改老师
// teacherDao.teacherupdate("6245633e5b525cdff21827e8", {
// "classType" : "平行班",
// }).then(data => {
// console.log(data);
// })
// 分页查询
// studentsDao.query({},1,1).then((data) => {
// console.log(data);
// })
studentsDao.teacherpopulate().then((data) => {
console.log(data);
})
//studentsMock.js
let Mock = require("mockjs");
let students = Mock.mock({
"dates|20-25": [{
"studentNum":"@word(1,6)" ,
"studentName|1": "@cname",
"tel": /^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/,
"education|1": ['@pick(["大专","本科","研究生","博士"])'],
"classid":"@word(3,9)",
}]
}).dates;
module.exports = students;
//teacherMock.js
let Mock = require("mockjs");
let teachers = Mock.mock({
"dates|3-5": [{
"className":"@word(1,6)" ,
"classTeacher":"@cname",
}]
}).dates;
module.exports = teachers;