• Mongoose基本操作


    1、简介

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

    2、使用步骤

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

    npm i mongoose

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

    1. /*
    2. 完成mongodb数据库的连接
    3. 1.导入mongoose模块
    4. 2.通过mongoose.connect(参数)
    5. 参数:目标数据库的连接地址,mongodb数据库连接地址的组成
    6. 协议://ip地址:端口号/数据库名
    7. 协议:mongodb
    8. ip地址:如果是本地数据库:127.0.0.1或者localhost
    9. 端口号:mongodb数据库的默认端口号是27017
    10. 数据库名:自己创建的数据库
    11. 3.通过监听数据库的连接情况
    12. */
    13. const mongoose=require('mongoose')
    14. mongoose.connect("mongodb://127.0.0.1:27017/woniuFoods")
    15. mongoose.connection.on('connected',()=>{console.log('数据库连接成功');})

    为了让程序更加清晰,这里我们将如上代码编写在一个独立的文件上,如下所示

    首先,在项目的根目录下创建util文件夹,该文件夹以后存放所有的工具函数

    其次,在该文件夹下创建database.js,将如上代码复制进入

    最后,在app.js文件中引入database.js文件,如下所示

    require('./util/database')

    3.Schema的配置

    在项目根目录下新建model文件夹,该文件夹下存放所有的模型

    1. //引入Schema对象
    2. const {Schema,model}=require('mongoose')
    3. //定义Schema
    4. const swiperSchema=new Schema({
    5. _id:Schema.Types.ObjectId,
    6. goods_id:Number,
    7. image_url:String,
    8. navigator_url:String,
    9. open_type:String
    10. })

    4.定义模型

    1. //定义模型
    2. /*
    3. model方法的参数说明
    4. 参数1:模型的名称
    5. 参数2:Schema对象
    6. 参数3:MongoDB数据库中的集合的名称
    7. */
    8. module.exports.swiperModel=model('swiperModel',swiperSchema,"swipers")

    3、CRUD

    3.1、查询所有数据

    1. const express=require('express')
    2. const router=express.Router()
    3. const {swiperModel}=require('../model/swiperModel')
    4. //查询所有轮播图图片
    5. router.get('/findAll',async(req,res)=>{
    6. //从mongodb数据库woniuFoods/swipers中查询所有的数据
    7. let rows=await swiperModel.find()
    8. //将数据返回给前端
    9. res.send({code:1,rows})
    10. })
    11. module.exports=router

    3.2、模糊查询

    后端代码实现

    1. router.get('/searchMeals',async(req,res)=>{
    2. console.log("*************");
    3. let {name}=req.query;
    4. //{name:'包年套餐'}
    5. let rows=await mealModel.find({name:{$regex:name},state:1})
    6. if(rows.length>0){
    7. res.send({code:1,message:'查询成功',rows})
    8. }else{
    9. res.send({code:0,message:'没有查找到相应的套餐信息',rows:[]})
    10. }
    11. })

    前端代码实现

    1. document.querySelector('#searchBtn').addEventListener('click', async () => {
    2. let name = document.querySelector('#name').value;
    3. if (name) {
    4. let { code, message, rows } = await ajax({
    5. type: 'GET',
    6. url: '/meal/searchMeals',
    7. data: {
    8. name: document.querySelector('#name').value
    9. }
    10. })
    11. if (code) {
    12. render(rows);
    13. } else {
    14. document.querySelector("tbody").innerHTML = `
    15. ${message}
    16. `
    17. }
    18. } else {
    19. render(rows)
    20. }
    21. })

    3.3、删除操作

    前端代码实现

    第1步:在列表渲染方法中设置删除按钮

    1. "${item._id}">
    2. <button>查看button>
    3. <button>下架button>
    4. <button>上架button>
    5. <button class='delBtn'>删除button>

    第2步:为按钮绑定单击事件,并完成向后端发送请求

    1. document.querySelector("tbody").addEventListener('click', async e => {
    2. if (e.target.className == "delBtn") {
    3. if (window.confirm('您确定要删除吗?')) {
    4. let _id = e.target.parentElement.getAttribute("ids");
    5. let { code, message, rows } = await ajax({ type: 'DELETE', url: '/meal/delMeal',
    6. data: { _id } })
    7. if (code) {
    8. window.alert(message)
    9. render(rows);
    10. } else {
    11. window.alert(message);
    12. }
    13. }
    14. }
    15. })

    后端代码实现

    1. router.delete('/delMeal',async(req,res)=>{
    2. let {deletedCount}=await mealModel.deleteOne(req.body)
    3. let rows=await mealModel.find();
    4. deletedCount?res.send({code:1,message:'套餐删除成功',rows}):res.send({code:0,message:'套餐删除失败',rows:[]})
    5. })

    3.4、按ID查询

    后端操作

    1. router.get('/getMealById',async(req,res)=>{
    2. console.log(req.query);
    3. try{
    4. let data=await mealModel.findById(req.query)
    5. res.send({code:1,message:'查询成功',data})
    6. }catch(err){
    7. res.send({code:0,message:'查询失败'})
    8. }
    9. })

    说明

    • 按ID查询的方法有两种

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

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

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

    前端操作

    • 首先给详情按钮设置class,主要为了后续事件委托的时候能找到
      1. "${item._id}">
      2. <button class="detailBtn">查看button>
      3. <button>下架button>
      4. <button>上架button>
      5. <button class='delBtn'>删除button>
      6. <button>修改button>

    • 通过事件委托的方式为查看按钮绑定单击事件,绑定后在事件回调函数中跳转到详情页
      1. document.querySelector("tbody").addEventListener('click',async e=>{
      2. if (e.target.className == "detailBtn") {
      3. let _id = e.target.parentElement.getAttribute("ids");
      4. window.location.href=`../detail.html?id=${_id}`
      5. }
      6. })

    • 在详情页页面加载的时候,获取到上一页传递的ID,并且向服务端发送请求来获取数据
      1. window.addEventListener('DOMContentLoaded',async()=>{
      2. let _id=location.search.split("=")[1];
      3. let {code,message,data:{_id:id,mouth,name,normalPrice,salePrice}}=await ajax({type:'GET',url:'/meal/getMealById',data:{_id}})
      4. document.querySelector("#name").innerHTML=name;
      5. document.querySelector("#mouth").innerHTML=mouth;
      6. document.querySelector("#normalPrice").innerHTML=normalPrice;
      7. document.querySelector("#salePrice").innerHTML=salePrice;
      8. })

      3.5、修改操作

      后端实现

      1. router.post('/updateMeal',async(req,res)=>{
      2. let {modifiedCount}=await mealModel.updateOne({_id:req.body._id},req.body)
      3. modifiedCount?res.send({code:1,message:'修改成功'}):res.send({code:0,message:'修改失败'})
      4. })

      前端实现

    • 首先给修改按钮设置class,主要为了后续事件委托的时候能找到
      1. "${item._id}">
      2. <button class="detailBtn">查看button>
      3. <button class="soldoutBtn">下架button>
      4. <button class='delBtn'>删除button>
      5. <button class='updateBtn'>修改button>

    • 通过事件委托的方式为修改按钮绑定单击事件,绑定后在事件回调函数中跳转到修改页
      1. document.querySelector("tbody").addEventListener('click',async e=>{
      2. if (e.target.className == "updateBtn") {
      3. let _id = e.target.parentElement.getAttribute("ids");
      4. window.location.href=`../update.html?id=${_id}`
      5. }
      6. })

    • 修改页具体js实现
      1. window.addEventListener('DOMContentLoaded',async()=>{
      2. let _id=location.search.split("=")[1];
      3. let {code,message,data:{_id:id,mouth,name,normalPrice,salePrice}}=await
      4. ajax({type:'GET',url:'/meal/getMealById',data:{_id}})
      5. document.querySelector("#name").value=name;
      6. document.querySelector("#mouth").value=mouth;
      7. document.querySelector("#normalPrice").value=normalPrice;
      8. document.querySelector("#salePrice").value=salePrice;
      9. document.querySelector("#id").value=_id;
      10. document.querySelector("#updateBtn").addEventListener('click',async()=>{
      11. let _id=document.querySelector("#id").value;
      12. let name=document.querySelector("#name").value;
      13. let mouth=document.querySelector("#mouth").value
      14. let normalPrice=document.querySelector("#normalPrice").value
      15. let salePrice=document.querySelector("#salePrice").value
      16. let {code,message}=await ajax({
      17. type:'POST',
      18. url:'/meal/updateMeal',
      19. data:{
      20. _id,
      21. name,
      22. mouth,
      23. normalPrice,
      24. salePrice
      25. }
      26. })
      27. alert(message);
      28. })
      29. })

      3.6、增加操作

      1.模型设置

      1. const {Schema,model}=require('mongoose')
      2. //定义Schema
      3. const mealSchema=new Schema({
      4. mouth:Number,
      5. name:String,
      6. normalPrice:Number,
      7. salePrice:Number,
      8. state:Number,
      9. type:Number
      10. },{
      11. versionKey:false
      12. })
      13. //定义模型
      14. module.exports.mealModel=model("mealModel",mealSchema,"meal")

      备注:如果要让mongdb自动产生ID为24位的ObectId格式,就不要在模型上设置_id

      如果自己要在前台输入字符串为编号,可以如下设置模型

      1. const {Schema,model}=require('mongoose')
      2. //定义Schema
      3. const mealSchema=new Schema({
      4. _id:String,
      5. mouth:Number,
      6. name:String,
      7. normalPrice:Number,
      8. salePrice:Number,
      9. state:Number,
      10. type:Number
      11. },{
      12. versionKey:false
      13. })
      14. //定义模型
      15. module.exports.mealModel=model("mealModel",mealSchema,"meal")

      2.后端代码编写

      1. router.post('/addMeal',async(req,res)=>{
      2. //获取请求参数
      3. let meal=req.body
      4. //通过后端设置的
      5. meal.type=0
      6. meal.state=1
      7. //添加数据到数据库集合中
      8. try{
      9. await mealModel.create(meal)
      10. res.send({code:1,message:'套餐增加成功'})
      11. }catch(err){
      12. res.send({code:0,message:'套餐增加失败'})
      13. }
      14. })

      3.前端代码实现

      1. window.addEventListener('DOMContentLoaded',()=>{
      2. document.querySelector('#addBtn').addEventListener('click',async()=>{
      3. let {code,message}=await ajax({
      4. type:'POST',
      5. url:'/meal/addMeal',
      6. data:{
      7. _id:document.querySelector("#no").value,
      8. name:document.querySelector("#name").value,
      9. mouth:document.querySelector('#mouth').value,
      10. normalPrice:document.querySelector('#normalPrice').value,
      11. salePrice:document.querySelector('#salePrice').value,
      12. }
      13. })
      14. if(code){
      15. alert(message);
      16. window.location.href="meal.html";
      17. }else{
      18. alert(message)
      19. }
      20. })
      21. })

  • 相关阅读:
    java发送邮件完成密码找回功能
    集体唱好混动技术,传统车企最后的倔强?
    http协议(序列化与反序列化)
    vim 显示行号
    【k8s】Kubernetes版本v1.17.3 kubesphere 3.1.1 默认用户登录失败
    牛客刷题<14>键盘编码电路
    SpringBoot+Vue项目线上买菜系统
    题目:2695.包装数组
    【Qt控件之QTableWidget】使用及技巧
    03.Pandas数据结构
  • 原文地址:https://blog.csdn.net/m0_74331185/article/details/128068661