1、简介
使用Moongoose能够快速操作MongoDB数据库,Moongoose中提供了很多函数,可以使用这些函数MoongoDB数据库进行增加文档、删除文档、查询文档等一些列操作,是Node.js程序
1.使用NPM命令下载mongoose到本地
npm i mongoose
2.在app.js文件中编写连接MongoDB数据库服务器的程序
- /*
- 完成mongodb数据库的连接
- 1.导入mongoose模块
- 2.通过mongoose.connect(参数)
- 参数:目标数据库的连接地址,mongodb数据库连接地址的组成
- 协议://ip地址:端口号/数据库名
- 协议:mongodb
- ip地址:如果是本地数据库:127.0.0.1或者localhost
- 端口号:mongodb数据库的默认端口号是27017
- 数据库名:自己创建的数据库
- 3.通过监听数据库的连接情况
- */
- const mongoose=require('mongoose')
- mongoose.connect("mongodb://127.0.0.1:27017/woniuFoods")
- mongoose.connection.on('connected',()=>{console.log('数据库连接成功');})
为了让程序更加清晰,这里我们将如上代码编写在一个独立的文件上,如下所示
首先,在项目的根目录下创建util文件夹,该文件夹以后存放所有的工具函数
其次,在该文件夹下创建database.js,将如上代码复制进入
最后,在app.js文件中引入database.js文件,如下所示
require('./util/database')
3.Schema的配置
在项目根目录下新建model文件夹,该文件夹下存放所有的模型
- //引入Schema对象
- const {Schema,model}=require('mongoose')
- //定义Schema
- const swiperSchema=new Schema({
- _id:Schema.Types.ObjectId,
- goods_id:Number,
- image_url:String,
- navigator_url:String,
- open_type:String
- })
4.定义模型
- //定义模型
- /*
- model方法的参数说明
- 参数1:模型的名称
- 参数2:Schema对象
- 参数3:MongoDB数据库中的集合的名称
- */
- module.exports.swiperModel=model('swiperModel',swiperSchema,"swipers")
3、CRUD
- const express=require('express')
- const router=express.Router()
- const {swiperModel}=require('../model/swiperModel')
- //查询所有轮播图图片
- router.get('/findAll',async(req,res)=>{
- //从mongodb数据库woniuFoods/swipers中查询所有的数据
- let rows=await swiperModel.find()
- //将数据返回给前端
- res.send({code:1,rows})
- })
- module.exports=router
3.2、模糊查询
后端代码实现
- router.get('/searchMeals',async(req,res)=>{
- console.log("*************");
- let {name}=req.query;
- //{name:'包年套餐'}
- let rows=await mealModel.find({name:{$regex:name},state:1})
- if(rows.length>0){
- res.send({code:1,message:'查询成功',rows})
- }else{
- res.send({code:0,message:'没有查找到相应的套餐信息',rows:[]})
- }
- })
前端代码实现
- document.querySelector('#searchBtn').addEventListener('click', async () => {
- let name = document.querySelector('#name').value;
- if (name) {
- let { code, message, rows } = await ajax({
- type: 'GET',
- url: '/meal/searchMeals',
- data: {
- name: document.querySelector('#name').value
- }
- })
- if (code) {
- render(rows);
- } else {
- document.querySelector("tbody").innerHTML = `
-
${message} -
` - }
- } else {
- render(rows)
- }
- })
3.3、删除操作
前端代码实现
第1步:在列表渲染方法中设置删除按钮
"${item._id}">- <button>查看button>
- <button>下架button>
- <button>上架button>
- <button class='delBtn'>删除button>
-
第2步:为按钮绑定单击事件,并完成向后端发送请求
- document.querySelector("tbody").addEventListener('click', async e => {
- if (e.target.className == "delBtn") {
- if (window.confirm('您确定要删除吗?')) {
- let _id = e.target.parentElement.getAttribute("ids");
- let { code, message, rows } = await ajax({ type: 'DELETE', url: '/meal/delMeal',
- data: { _id } })
- if (code) {
- window.alert(message)
- render(rows);
- } else {
- window.alert(message);
- }
- }
- }
- })
后端代码实现
- router.delete('/delMeal',async(req,res)=>{
- let {deletedCount}=await mealModel.deleteOne(req.body)
- let rows=await mealModel.find();
- deletedCount?res.send({code:1,message:'套餐删除成功',rows}):res.send({code:0,message:'套餐删除失败',rows:[]})
- })
3.4、按ID查询
后端操作
- router.get('/getMealById',async(req,res)=>{
- console.log(req.query);
- try{
- let data=await mealModel.findById(req.query)
- res.send({code:1,message:'查询成功',data})
- }catch(err){
- res.send({code:0,message:'查询失败'})
- }
- })
说明
按ID查询的方法有两种
这两种查询方式不同点,第一种方式查询后的结果是一个数组,然后对象放在数组中;第二种方式查询的结果就是一个对象
通过ID查询和别的查询不同点,如果ID不对就报异常了,所以处理过程中要通过异常处理的方式来解决
前端操作
"${item._id}">- <button class="detailBtn">查看button>
- <button>下架button>
- <button>上架button>
- <button class='delBtn'>删除button>
- <button>修改button>
-
- document.querySelector("tbody").addEventListener('click',async e=>{
- if (e.target.className == "detailBtn") {
- let _id = e.target.parentElement.getAttribute("ids");
- window.location.href=`../detail.html?id=${_id}`
- }
- })
- window.addEventListener('DOMContentLoaded',async()=>{
- let _id=location.search.split("=")[1];
- let {code,message,data:{_id:id,mouth,name,normalPrice,salePrice}}=await ajax({type:'GET',url:'/meal/getMealById',data:{_id}})
- document.querySelector("#name").innerHTML=name;
- document.querySelector("#mouth").innerHTML=mouth;
- document.querySelector("#normalPrice").innerHTML=normalPrice;
- document.querySelector("#salePrice").innerHTML=salePrice;
- })
3.5、修改操作
后端实现
- router.post('/updateMeal',async(req,res)=>{
- let {modifiedCount}=await mealModel.updateOne({_id:req.body._id},req.body)
- modifiedCount?res.send({code:1,message:'修改成功'}):res.send({code:0,message:'修改失败'})
- })
前端实现
"${item._id}">- <button class="detailBtn">查看button>
- <button class="soldoutBtn">下架button>
- <button class='delBtn'>删除button>
- <button class='updateBtn'>修改button>
-
- document.querySelector("tbody").addEventListener('click',async e=>{
- if (e.target.className == "updateBtn") {
- let _id = e.target.parentElement.getAttribute("ids");
- window.location.href=`../update.html?id=${_id}`
- }
- })
- window.addEventListener('DOMContentLoaded',async()=>{
- let _id=location.search.split("=")[1];
- let {code,message,data:{_id:id,mouth,name,normalPrice,salePrice}}=await
- ajax({type:'GET',url:'/meal/getMealById',data:{_id}})
- document.querySelector("#name").value=name;
- document.querySelector("#mouth").value=mouth;
- document.querySelector("#normalPrice").value=normalPrice;
- document.querySelector("#salePrice").value=salePrice;
- document.querySelector("#id").value=_id;
- document.querySelector("#updateBtn").addEventListener('click',async()=>{
- let _id=document.querySelector("#id").value;
- let name=document.querySelector("#name").value;
- let mouth=document.querySelector("#mouth").value
- let normalPrice=document.querySelector("#normalPrice").value
- let salePrice=document.querySelector("#salePrice").value
- let {code,message}=await ajax({
- type:'POST',
- url:'/meal/updateMeal',
- data:{
- _id,
- name,
- mouth,
- normalPrice,
- salePrice
- }
- })
- alert(message);
- })
- })
3.6、增加操作
1.模型设置
- const {Schema,model}=require('mongoose')
- //定义Schema
- const mealSchema=new Schema({
- mouth:Number,
- name:String,
- normalPrice:Number,
- salePrice:Number,
- state:Number,
- type:Number
- },{
- versionKey:false
- })
- //定义模型
- module.exports.mealModel=model("mealModel",mealSchema,"meal")
备注:如果要让mongdb自动产生ID为24位的ObectId格式,就不要在模型上设置_id
如果自己要在前台输入字符串为编号,可以如下设置模型
- const {Schema,model}=require('mongoose')
- //定义Schema
- const mealSchema=new Schema({
- _id:String,
- mouth:Number,
- name:String,
- normalPrice:Number,
- salePrice:Number,
- state:Number,
- type:Number
- },{
- versionKey:false
- })
- //定义模型
- module.exports.mealModel=model("mealModel",mealSchema,"meal")
2.后端代码编写
- router.post('/addMeal',async(req,res)=>{
- //获取请求参数
- let meal=req.body
- //通过后端设置的
- meal.type=0
- meal.state=1
- //添加数据到数据库集合中
- try{
- await mealModel.create(meal)
- res.send({code:1,message:'套餐增加成功'})
- }catch(err){
- res.send({code:0,message:'套餐增加失败'})
- }
- })
3.前端代码实现
- window.addEventListener('DOMContentLoaded',()=>{
- document.querySelector('#addBtn').addEventListener('click',async()=>{
- let {code,message}=await ajax({
- type:'POST',
- url:'/meal/addMeal',
- data:{
- _id:document.querySelector("#no").value,
- name:document.querySelector("#name").value,
- mouth:document.querySelector('#mouth').value,
- normalPrice:document.querySelector('#normalPrice').value,
- salePrice:document.querySelector('#salePrice').value,
- }
- })
- if(code){
- alert(message);
- window.location.href="meal.html";
- }else{
- alert(message)
- }
- })
- })