Day15-MongoDB数据库操作
一 简介
数据库就是用来存储数据的仓库
常用的数据库:Oracle,MySql,Sqlit,MongoDB
MongoDB是一种非关系型数据库,主要用来存储json数据
二 安装mongodb
双击mongodb安装包
三 安装Navicat
1 安装Navicat
2 破解Navicat
3 使用Navicat连接mongodb
4 新建数据库
5 新建集合
6.在navicat右下角可以进行视图切换
四 Nodejs操作mongodb数据库
1 编写db.js
(1)安装mongoose插件
npm i mongoose@6.9.1
(2)在项目种创建utils文件夹,里面创建db.js文件
let mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1:27017/movieApp",(error)=>{
if(error){
console.log("数据库链接失败",error);
}else{
console.log("数据库链接成功");
}
})
(3)app.js文件,引入db.js
var logger = require('morgan');
//路由请求之前,连接数据库
require('./utils/db')
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
let moviesRouter = require('./routes/movies')
(4)启动项目,加载db.js。测试能否连接数据库
nodemon app.js
2 设计Model来操作数据库
(1)在项目中新建model文件夹
(2)在model文件夹下新建UserModel.js文件
/**
* 1.导入mongoose插件,并解构出Schema(类) model(对象)
*/
const {Schema,model} = require("mongoose")
/**
* 2.使用Schema创建集合对象
*/
const userSchema = new Schema({
username:String,
password:String
},({versionKey:false}))
//({versionKey:false}) 向数据库中新增数据时,不生成_v这个字段
/**
* 3.暴露model对象
* 参数一 模型名 参数二 Schema对象 参数三 数据库中集合的名称
*/
module.exports = model("UserModel",userSchema,"userinfo")
(3)在UserController.js中导入UserModel.js
(4) 在UserController.js中编写增删改查相关的代码
/**
* 导入UserModel
*/
let userModel = require("../model/UserModel")
class UserController{
/**
* 查询所有
* async和await一定同时出现,他们的作用就是让函数里面的代码变成同步代码
*/
async findAll(req,res){
// 调用模型的查询方法,查询所有的数据
//查询数据库是一个非常耗时的操作,查询数据库的操作可能还没有执行完成,这个函数里面其它的代码都已经跑完了
const result = await userModel.find()
res.send({code:200,msg:"查询成功",data:result})
}
/**
* 根据id查询
*/
async getUserinfo(req,res){
const {_id} = req.query
const result = await userModel.find({_id})
const obj = result[0]
res.send({code:200,msg:"查询成功",data:obj})
}
/**
* 登录
*/
async login(req,res){
const {username,password} = req.body
const result = await userModel.find({username,password})
if(result.length == 0){
res.send({code:500,msg:"账号或密码错误",data:{}})
}else{
let {_id,username} = result[0]
let user = {_id,username}
res.send({code:200,msg:"登录成功",data:user})
}
}
/**
* 注册
*/
async register(req,res){
let {username,password} = req.body
//1.判断账号是否存在
let arr1 = await userModel.find({username})
if(arr1.length > 0){
res.send({code:500,msg:"账号已存在,注册失败"})
}else{
//2.把数据保存到数据库
await userModel.create({
username,
password
})
res.send({code:200,msg:"注册成功"})
}
}
/**
* 根据id删除
*/
async deleteById(req,res){
let {_id} = req.body
let result = await userModel.deleteOne({_id})
if(result.deletedCount == 1){
res.send({code:200,msg:"删除成功"})
}else{
res.send({code:500,msg:"删除失败"})
}
}
/**
* 根据id修改密码
*/
async updatePasswordById(req,res){
let {_id,newPassword} = req.body
let result = await userModel.updateOne({_id},{password:newPassword})
if(result.modifiedCount == 1){
res.send({code:200,msg:"修改成功"})
}else{
res.send({code:500,msg:"修改失败"})
}
}
}
module.exports = new UserController()
程序按照从上往下的顺序执行的代码,称为同步代码
程序没有按照从上往下的顺序自习的代码,称为异步代码
UserModel中所有的操作都是异步
async(异步) 写在方法前面
await(等待) 写在调用异步方法的前面
async和await的作用是让异步代码变成同步代码
String:代表字符串
Number:代表数字
Date:代表日期
Array:数组
Boolean:布尔类型值
ObjectId:对象编号
Decimal128:代表小数,小数点后更精确
3 mongodb的查询
表名.find(查询条件)
查询条件
const data = await UserModel_DB.find({_id:"1"}) 找id为1的数据
const data = await UserModel_DB.find({username:"admin"}) 找到标题中包含admin的数据
{price:{$lt:1000}} 找到价格小于1000的项 ($lt小于 $lte小于等于 $gt大于 $gte大于等于)
let count = await UserModel_DB.find().count() // 统计数量
let count = await UserModel_DB.find().limit(4) // 查询前4条
let count = await goods.find().skip(4).limit(4) //跳过前4条再取出4条数据
let data = await UserModel_DB.find().sort({price:1}) //根据价格排序 -1 降序 1 升序