Mongoose基本操作
admin
2024-02-20 05:05:58
0

1、简介

使用Moongoose能够快速操作MongoDB数据库,Moongoose中提供了很多函数,可以使用这些函数MoongoDB数据库进行增加文档、删除文档、查询文档等一些列操作,是Node.js程序

2、使用步骤

1.使用NPM命令下载mongoose到本地

npm i mongoose

2.在app.js文件中编写连接MongoDB数据库服务器的程序

/* 完成mongodb数据库的连接1.导入mongoose模块2.通过mongoose.connect(参数)参数:目标数据库的连接地址,mongodb数据库连接地址的组成协议://ip地址:端口号/数据库名协议:mongodbip地址:如果是本地数据库: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

3.1、查询所有数据

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步:在列表渲染方法中设置删除按钮

第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查询的方法有两种

    • 通过mealModel.find()
    • 通过mealModel.findById()

    这两种查询方式不同点,第一种方式查询后的结果是一个数组,然后对象放在数组中;第二种方式查询的结果就是一个对象

  • 通过ID查询和别的查询不同点,如果ID不对就报异常了,所以处理过程中要通过异常处理的方式来解决

前端操作

  • 首先给详情按钮设置class,主要为了后续事件委托的时候能找到

  • 通过事件委托的方式为查看按钮绑定单击事件,绑定后在事件回调函数中跳转到详情页
    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}`}})

  • 在详情页页面加载的时候,获取到上一页传递的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:'修改失败'})
    })

    前端实现

  • 首先给修改按钮设置class,主要为了后续事件委托的时候能找到

  • 通过事件委托的方式为修改按钮绑定单击事件,绑定后在事件回调函数中跳转到修改页
    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}`}
    })

  • 修改页具体js实现
    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").valuelet normalPrice=document.querySelector("#normalPrice").valuelet salePrice=document.querySelector("#salePrice").valuelet {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=0meal.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)}})
    })

相关内容

热门资讯

我来教大家“掼蛋大师辅助器ap... 亲,掼蛋大师这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,掼蛋大师的开挂软件,名...
我来教大家“开心联盟辅助器ap... 您好,开心联盟这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“友愉棋牌辅助器ap... 您好,友愉棋牌这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“全盛棋牌辅助器ap... 亲,全盛棋牌这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,全盛棋牌的开挂软件,名...
我来教大家“情怀三三麻将辅助器... 我来教大家“情怀三三麻将辅助器app官方下载最新版本更新”详细分享开挂一、情怀三三麻将AI软件牌型概...
我来教大家“无锡好运麻将辅助器... 亲,无锡好运麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,无锡好运麻将的开挂...
我来教大家“推筒子辅助器app... 您好,推筒子这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌...
我来教大家“比奇堡辅助器app... 我来教大家“比奇堡辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方神...
我来教大家“新兴茶苑辅助器ap... 我来教大家“新兴茶苑辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“欢乐互动辅助器ap... 我来教大家“欢乐互动辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“东方互娱辅助器ap... 亲,东方互娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,东方互娱的开挂软件,名...
我来教大家“天天乐清麻将辅助器... 我来教大家“天天乐清麻将辅助器app官方下载最新版本更新”详细分享开挂一、天天乐清麻将AI软件牌型概...
我来教大家“唐三彩辅助器app... 我来教大家“唐三彩辅助器app官方下载最新版本更新”详细分享开挂一、唐三彩AI软件牌型概率发牌机制”...
我来教大家“Y0辅助器app官... 我来教大家“Y0辅助器app官方下载最新版本更新”详细分享开挂一、Y0AI软件牌型概率发牌机制”必胜...
我来教大家“天天互娱辅助器ap... 亲,天天互娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,天天互娱的开挂软件,名...
我来教大家“悟空竞技麻将辅助器... 亲,悟空竞技麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,悟空竞技麻将的开挂...
我来教大家“情怀开化麻将辅助器... 我来教大家“情怀开化麻将辅助器app官方下载最新版本更新”详细分享开挂一、情怀开化麻将AI软件牌型概...
我来教大家“龙炎互娱辅助器ap... 我来教大家“龙炎互娱辅助器app官方下载最新版本更新”详细分享开挂一、龙炎互娱AI软件牌型概率发牌机...
我来教大家“闲逸碰胡辅助器ap... 亲,闲逸碰胡这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,闲逸碰胡的开挂软件,名...
我来教大家“友聚麻将辅助器ap... 我来教大家“友聚麻将辅助器app官方下载最新版本更新”详细分享开挂一、友聚麻将AI软件牌型概率发牌机...