【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作

用Nodejs操作mongodb结合Schema实现数据库操作

  • Mongoose
    • 创建Schema
    • 定义Schema对象并映射到数据库
    • Model的使用
      • 创建文档内容
      • 删除文档内容
      • 修改文档内容
      • 查询文档内容
    • Document的使用
      • 创建并保存
      • 将文档对象转换为JSON对象
    • 模块化
      • 数据库连接
      • 模型初始化
  • 项目部署
    • 路由定义
    • 后端操作定义
    • 启动服务

Mongoose

Mongoose是一个第三方的用于操作mongodb的库,与之前一篇文章中直接使用原生的由mongodb提供的CURD来直接操作数据库不同,在Mongoose中提供了更高层的抽象,增加了自动检查的机制。其主要结构如下:
Schema在node.js中的mongoose库中,主要作用是作为一个模板,通过这个模板可以映射到数据库和数据表。同时在Schema下面一个层级还有Model,通过Model可以创建一个数据文档对象,通过这个对象就可以实现对数据库的增删改查操作。

创建Schema

var productSchema = new Schema({name:String,type:String,price:Number,innum:Number,indate:Date,outnum:Number,{type: Date,default: Date.now}
})

定义Schema对象并映射到数据库

var productmodel = mongoose.model("product", productSchema);

Model的使用

创建文档内容

Model.create(doc(s),[callback])
  • doc:文档对象,可以一次性传入多个对象。
  • callback:回调函数,返回新增的内容。

删除文档内容

//删除所有符合条件
Model.remove(conditions, [callback])
//删除一条记录
Model.deleteOne(conditions, [callback])
//删除多条记录
Model.deleteMany(conditions, [callback])
  • conditions:删除对象匹配条件
  • callback:回调函数。

修改文档内容

//更新所有符合条件
Model.update(conditions, doc, options, callback) 
//更新多条符合条件
Model.updateMany(conditions, doc, options, callback) 
//更新一条
Model.updateOne(conditions, doc, options, callback) 
  • conditions:修改对象匹配条件
  • doc:修改以后的内容,如果需要不是覆盖修改,则需要添加$set字段用于约束。
  • options:修改选项,用来传multi参数,一般情况用不上。
  • callback:回调函数

查询文档内容

//查询所有符合条件的文档
Model.find(conditions, [projection], [options], [callback])
//根据文档的id属性查询文档
Model.findByID(id, [projection], [options], [callback])
//查询符合条件的第一个文档
Model.findOne([conditions], [projection], [options], [callback])
  • conditions:表示查询的条件,可以加上{name:“张三”}用来查询张三相关的数据字段。
  • projections:表示投影,可以设置投影实现仅查询返回部分字段的内容。比如可以设置**{name:1,_id:0}表示仅返回名字字段不返回_id字段;同样的也能通过字符串的形式进行限制,如"name -_id",条件之间加上空格,另外负号表示不返回**。
  • options:查询选项,比如skip,limit,可以通过这个功能实现分页操作
  • callback:回调函数,将查询的结果返回,格式是数组

Document的使用

创建并保存

//创建一个文档,直接实例化一个model就可以实现
var prodoc = new productmodel({name:"旺仔",type:"食品",price:6,innum:100,indate:2023-04-05,outnum:20,outdate:2023-04-08
})
prodoc.save(function(err)){if(!err){console.log("数据添加成功!");}
}

将文档对象转换为JSON对象

在向用户显示数据的时候会遇到想要只向用户展示一部分的数据字段而不想展示所有的数据字段的情况,同时还不想删除数据库中的内容,这时候就需要将文档对象转换成JSON,变成一个单独用来存储数据的格式。需要注意的是转换以后Document相关的方法都没法使用了。

doc = doc.toObject()
//删除数据对象中的price字段
Delete doc.price;

模块化

数据库连接

新建一个connection.js的文件用于封装连接数据库的操作

const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/shop");
mongoose.connection.once("open",function() {
console.log("数据库连接成功~~~");
});

再别的文件中只需要:

require("./tools/connection")

就可以实现连接,而不用每次连接都要在代码前面写这么长一串内容。

模型初始化

创建models文件夹,然后创建一个名称为product的js文件,如果有需要仅仅需要在这个文件夹下面继续新建模块就可以了。

var mongoose = require("mongoose")
var Schema = mongoose.Schema;var productSchema = new Schema({name:String,type:String,price:Number,innum:Number,indate:Date,outnum:Number,outdate:{type: Date,default: Date.now}
});var productmodel = mongoose.model("product",productSchema);//将上述代码导出为模块
module.export = Productmodel;

在其他的文件中只需要以下代码就可以调用:

const product = require("./models/product")

项目部署

在这里插入图片描述

路由定义

const express = require("express");
const router = express.Router();const operation = require("../tools/opra");const { ObjectId } = require("mongodb");
//新增数据
router.post("/add",async(req,res)=>{let result = await operation.insert([{"name": "taddy","type":"toy","price": 15,"innum":20,"indate":new Date("October 13, 2023 11:13:00"),"outnum":13,"outdate":new Date("October 13, 2023 15:13:00")}])res.send("数据新增成功!" + result);
})
//删除数据
router.delete("/:name", async(req, res)=>{try {var name = req.params;var result = await operation.remove({name:name});res.send("删除成功");return result;} catch (err) {res.send(err);}
})
//修改数据
router.put("/:name",async(req,res)=>{var name = req.params;var newdata = req.body;try{let result = await operation.update({name:name},newdata);res.send("数据修改成功");return result;}catch (err) {res.send("数据修改失败")}
})
//查询数据
router.get("/search/:name", async(req, res)=>{let name = req.params;var projection = "name -_id type price innum outnum indate outdate";var result = await operation.search({name:name},projection,function(err){if(!err){console.log("查询成功!");}else{console.log(err);}})return result;
})//汇总数据
module.exports = router;

后端操作定义

require("./connections");
const product = require("../models/product");//增操作
async function insert(doc){product.create(doc,function(err){if(!err) {console.log("数据插入成功");}else{console.log(err);}})
}//删操作
async function remove(query){product.remove(query,function(err){if(!err) {console.log("删除成功!");}else{console.log(err);}})
}
//改操作
async function update(query, newdata){product.update(query, newdata,function(err){if(!err) {console.log("数据更新成功");}else{console.log(err);}})
}
//查操作
async function search(query,projection){result = product.find(query,projection,function(err){if(!err) {console.log("查询成功");}else{console.log(err);}})return result;
}
//数据汇总
async function sumup(){//调用aggregate方法}module.exports = {insert,remove,update,search,sumup
}

启动服务

const express = require("express")const app = new express()
const router = require("./router/router")app.use("/",router)app.listen(80, ()=>{console.log("server running on localhost")
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何评价《沧浪之水》这本书?

1、我一辈子的经验就是不要做瞎子,要把事情看清楚,也不能做聋子,该听到的信息要听到,但是要做哑巴,看到了听到了心中有数就行了,可千万别张口说什么。 2、说是人人平等,那是安慰小人物的神话&am…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF(Primitive Equations Formulation)湍流风场模型,是大气科学和气象学中用来描述大气流动和气…

使用django-haystack+whoosh实现全文搜索

前言 好像是上个星期在写代码的时候遇到了一些问题,这个问题似乎我之前也遇到过,印象中好像也写博客进行记录了的,于是就想在我的博客系统中“查找”(表示很无奈居然没有搜索功能🥹🥹)&#xff…

Redis 主从复制,、哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式(Sentinel) 1.主要组件和概念 2.哨…

[240711] OpenSSF Scorecard - 自动评估开源项目安全风险的工具

目录 OpenSSF Scorecard - 自动评估开源项目安全风险的工具功能特点使用场景安装和使用竞品和相关项目进一步探索 OpenSSF Scorecard - 自动评估开源项目安全风险的工具 OpenSSF Scorecard 是一个由开源安全基金会(Open Source Security Foundation,Ope…

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是:http://localhost:8080/add?a1&b2 现在是:http://localhost:8080/add/a/b(全是斜杠) package com.demo.controller;import org.springframework.stereotype.Controller; import org…

odoo细分权限(根据业务需求)

odoo原生权限编写方式: 根据用户组分配权限 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sale_order,sale.order,model_sale_order,sales_team.group_sale_salesman,1,1, 1,0 access_sale_order_manager,sale.order.manager,model_…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册,往往是人机验证问题: kaggle网站验证

邮票孔是什么?和V割有什么区别?

邮票孔,也称为安装孔或通孔,是 PCB 中的圆形或非圆形开口,旨在允许将组件或 PCB 本身连接到支撑结构上。这些孔通常从顶面到底部钻穿或冲穿 PCB 层,形成连续的通道。冲压孔有各种尺寸和形状, 取决于 PCB 及其所容纳组件…

餐饮渠道年销4.2亿盒,光明look 30亿的极致大单品是如何策划的?

餐饮渠道年销4.2亿盒,光明look 30亿的极致大单品是如何策划的? 红酒代理业务下滑,从餐饮渠道主攻奶品类 雨帆食品集团,自2002年起是湖北地区红酒代理商,同时兼任光明乳业湖北荆州代理商。然而,到了2011年&a…

python--实验 9 类和对象

知识点 面向对象编程思想 面向对象编程是一种编程范式,它使用“对象”来设计软件,这些对象可以包含数据和代码,即属性和方法。 面向对象的程序设计的核心是对象,世间存在的万物皆为对象(上帝式思维) 面向对象&#xf…

TomCat服务器安装和配置教程

1.TomCat下载路径 TomCat官方网站:http://tomcat.apache.org 前往该网站下载安装tomcat,tar.gz文件是Linux操作系统的安装版本,zip文件是 windows操纵系统的压缩版本 打开后是如下网站,请下载匹配的操作系统的文件并且选择合适的…

2023 年 GitHub 上最受欢迎的编程语言

JavaScript 仍然是使用最多的编程语言,在 Web 开发中占据重要地位。 被广泛用于 Web 应用程序开发,框架如 React 和 Angular 促进了单页应用程序的开发。 Node.js 的出现使其在后端编程中同样重要。 Python 由于其简单性和广泛的库,Pyth…

自注意力简介

在注意力机制中,每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q,键k和值v都来自于同一组输入,那么这个注意力就被称为是自注意力(self-attention)。自注意力这部分理论,我觉得台大李宏毅老师…

新兴商业模式如何破局?市场策划专家的实战指南

在这个融合了传统市场、互联网和信息技术的大潮中,想要在市场营销策划上玩得转,咱们得有超凡的全局思维和跨界的协作精神。 下面,我就来和大家聊聊如何在这样一个复杂环境下搞定市场营销策划,让你在竞争激烈的市场中脱颖而出。 …

Nodejs 第八十二章(Nacos动态配置)

什么是动态配置? 在Nacos中,动态配置是指可以在运行时动态修改应用程序的配置信息,而不需要重新启动或重新部署应用程序。通过Nacos的动态配置功能,开发人员可以将应用程序的配置信息存储在Nacos服务器中,并在需要时进…

PTK是如何加密WLAN单播数据帧的?

1. References WLAN 4-Way Handshake如何生成PTK?-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中单播帧的加密使用PTK密钥,其PTK的密钥结构如下图所示: PTK的组成如上图所示,由K…

做一个专业的声音分析系统,需要对声音那些评判标准进行计算

为了构建一个专业的声音分析系统,需要对以下评判标准进行计算。每个标准需要相应的算法和技术指标来实现。下面是一些关键的评判标准和如何计算这些标准的具体方法: 1. 音质 清晰度 信噪比(SNR):计算音频信号中的信…

win11下部署Jenkins,build c#项目

一个c#的项目,由于项目经理总要新版本测试,以前每次都是手动出包,现在改成jenkins自动生成,节省时间。 一、下载Jenkins, 可以通过清华镜像下载Index of /jenkins/windows-stable/ | 清华大学开源软件镜像站 | Tsingh…

前端使用pinia中存入的值

导入pinia,创建pinia实例 使用pinia中的值