当前位置: 首页 > news >正文

在nodejs中使用Mongoose和MongoDB实现curd操作

在nodejs中使用Mongoose和MongoDB实现curd操作

Node.js中,数据库被用来存储和检索Web应用程序的数据。它们是构建动态和可伸缩应用程序的重要组成部分。Node.js提供了各种模块和包,可以与数据库一起工作,如MySQLPostgreSQLMongoDB等。它们允许开发人员使用各种操作来存储、查询和操作数据,例如创建、读取、更新和删除(CRUD)。

它们在需要快速和有效地存储和检索数据的Web应用程序中特别有用。例如,电子商务网站可以使用数据库来存储产品信息、用户数据和订单细节。社交媒体应用程序可以使用数据库存储用户配置文件、帖子和回复。

除了存储数据之外,数据库还提供数据索引、数据完整性和数据安全等功能。这些功能确保数据的存储和访问是正确和安全的。

因此,它们是Nodejs应用程序开发的一个重要组成部分,开发人员必须很好地理解如何使用数据库,以及如何有效地使用它们来构建健壮的应用程序。

数据库和ORM

数据库和ORM(对象关系映射器)在使用Node.js构建Web应用程序中发挥着至关重要的作用。如前所述,数据库是以特定方式组织的数据收集,以方便获取、管理和更新信息。

ORM是一种将对象映射到关系数据库表的编程技术。ORM提供了更高层次的抽象,使开发人员能够使用对象而不是SQL查询与数据库交互,从而更容易地使用数据库。ORM有助于减少与数据库交互所需的代码数量,并通过防止SQL注入攻击提供额外的安全层。

Nodejs支持SQLNoSQL数据库。数据库的选择取决于应用程序的需要和要求。SQL数据库最适合需要复杂查询和事务的应用程序,而NoSQL数据库适合需要灵活性和可伸缩性的应用程序。

Mongoose是一个受欢迎的用于NodejsORM,它提供了一个基于架构的解决方案来建模应用程序数据。通过允许开发人员为其数据定义模式和模型来简化与MongoDB的交互。模式定义了数据的结构,模型表示数据库中数据的收集。

Mongoose的使用

如上所述,ORM(对象关系映射)被用来简化与数据库的交互过程,通过使用面向对象的编程概念,而不是直接编写SQL查询,更容易执行CURD(创建、读取、更新、删除)操作。通过使用ORM,开发人员可以更加直观和有效地处理数据,提高生产率和减少错误。

Mongoose是一个在Nodejs中非常流行的ORM。它为建模应用程序数据提供了基于架构的解决方案,并提供了验证、中间件等功能。下面是一个例子:

首先使用npm进行安装:

npm install mongoose

然后,使用mongoose连接MongoDB数据库:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_database', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log('MongoDB connected')).catch((err) => console.log(err));

这个代码连接到一个本地的MongoDB数据库my_database 并在连接成功时将消息记录到控制台。

接下来,为存储在数据库中的数据定义一个Mongoose模式:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;const userSchema = new Schema({name: {type: String,required: true},email: {type: String,required: true,unique: true},password: {type: String,required: true},createdAt: {type: Date,default: Date.now}
});module.exports = mongoose.model('User', userSchema);

上面得代码定义了用户对象的模式,包括名称、电子邮件、密码和创建日期。required 属性指定某些字段是强制的,并且unique 属性确保每个电子邮件地址只能使用一次。

最后,使用定义的模式创建、读取、更新和删除数据库中的数据。

const User = require('./models/user');// Create a new user
const newUser = new User({name: 'leo',email: 'leo@example.com',password: '123'
});newUser.save().then(() => console.log('User created')).catch((err) => console.log(err));// Read all users
User.find().then((users) => console.log(users)).catch((err) => console.log(err));// Update a user
User.findOneAndUpdate({ name: 'leo' }, { name: 'alexsander' }).then(() => console.log('User updated')).catch((err) => console.log(err));// Delete a user
User.deleteOne({ name: 'Jane Doe' }).then(() => console.log('User deleted')).catch((err) => console.log(err));

在这个例子中,User 模型是从先前定义的架构文件导入的。新用户是使用save() 方法添加,可以使用findOneAndUpdate()deleteOne() 方法来操作数据库。这些方法都是由Mongoose提供的,简化了与数据库的交互过程。

简单实战

为了创建一个使用Mongoose来执行CRUD操作的Nodejs应用程序,我们将遵循以下步骤:

  • 搭建一个Nodejs应用。
  • 安装对应依赖(expressmongoose)。
  • 建立MongoDB数据库连接。
  • 为数据创建一个Mongoose 模式。
  • 创建相关路由来处理CURD操作。
  • 测试应用程序。

搭建一个Nodejs应用。

执行以下命令:

npm init

此命令将提示我们输入有关项目的信息:例如名称、版本和作者。可以输入信息,也可以按回车以接受默认值。

安装对应依赖

执行以下命令:

npm install express mongoose

建立MongoDB数据库连接

为了使用mongooseMongoDB数据库,我们需要建立一个连接来指向我们的MongoDB数据库。可以在我们项目的根目录中创建一个新文件db.js ,添加以下代码:

const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/my_database', { useNewUrlParser: true });const db = mongoose.connection;db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {console.log('Database connected successfully');
});

这个代码连接到一个在本地机器上运行my_database数据库。

为数据创建一个Mongoose 模式

现在我们已经建立了数据库连接,可以创建一个Mongoose 模式来定义数据的结构。在本例中,我们将为User模型创建一个简单的模式。

在我们项目的根目录中创建一个新文件user.js,并添加以下代码:

const mongoose = require('mongoose');const userSchema = new mongoose.Schema({name: String,email: String,age: Number
});const User = mongoose.model('User', userSchema);module.exports = User;

这个代码定义了一个Mongoose 模式,包含三个字段:name、email和age。然后,我们使用这个模式创建了一个称为UserMongoose 模型,并导出它用于我们应用程序的其他部分。

创建相关路由来处理CURD操作

现在我们已经建立了数据库连接和架构,我们可以创建路由来处理数据上的CRUD(创建、读取、更新、删除)操作。

在我们项目的根目录中创建一个新文件routes.js,并添加以下代码:

const express = require('express');
const User = require('./user');const router = express.Router();// Create a new user
router.post('/users', async (req, res) => {const { name, email, age } = req.body;try {const user = new User({ name, email, age });await user.save();res.send(user);} catch (error) {console.error(error);res.status(500).send(error);}
});// Get all users
router.get('/users', async (req, res) => {try {const users = await User.find({});res.send(users);} catch (error) {console.error(error);res.status(500).send(error);}
});// Update a user
router.put('/users/:id', async (req, res) => {const { id } = req.params;const { name, email, age } = req.body;try {const user = await User.findByIdAndUpdate(id, { name, email, age }, { new: true });res.send(user);} catch (error) {console.error(error);res.status(500).send(error);}
});// Delete a user
router.delete('/users/:id', async (req, res) => {const { id } = req.params;try {const user = await User.findByIdAndDelete(id);res.send(user);} catch (error) {console.error(error);res.status(500).send(error);}
});

测试应用程序

现在我们已经创建了所有必要的路由,我们可以测试我们的应用程序。在我们项目的根目录中创建一个新文件index.js,并添加以下代码:

const express = require('express');
const bodyParser = require('body-parser');
const db = require('./db');
const routes = require('./routes');const app = express();app.use(bodyParser.json());app.use('/', routes);app.listen(3000, () => {console.log('Server started on port 3000');
});

上面的代码实现了一个Nodejs服务器,添加了用于解析JSON请求体的中间件,同时设置了我们早些时候创建的路由。

为了测试我们的应用程序,我们可以使用一个工具,比如postman向服务器发送请求。例如,要创建一个新用户,我们可以将一个POST请求发送到http://localhost:3000/users

相关文章:

在nodejs中使用Mongoose和MongoDB实现curd操作

在nodejs中使用Mongoose和MongoDB实现curd操作 在Node.js中,数据库被用来存储和检索Web应用程序的数据。它们是构建动态和可伸缩应用程序的重要组成部分。Node.js提供了各种模块和包,可以与数据库一起工作,如MySQL、PostgreSQL、MongoDB等。它们允许开发人员使用各…...

10.28 校招 实习 内推 面经

绿*泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招|理想汽车2024校园招聘算法类岗位特辑(内推) 校招|理想汽车2024校园招聘算法类岗位特辑(内推) 2、校招 | 国网信…...

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML,通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…...

【调试技术】用户态查看PEB和TEB

概述:用户态查看进程 PEB 和 TEB(通过windbg附加或启动调试的exe) 0x01 用户态查看 TEB 和 PEB 在双机调试的时候,可以直接使用 !PEB PID 和 !TEB TID 获取进程和线程的相关信息,在用户态这两个命令就会失效。原因就是用户态不支持大写的 !T…...

如何搭建一个Spring MVC和Vue3的应用程序

要搭建一个基于Spring MVC框架和Vue3框架的前端应用程序,可以按照以下步骤进行: 创建Java项目并添加Spring MVC依赖 使用Maven或Gradle等构建工具创建一个Java项目,并在项目的pom.xml或build.gradle文件中添加Spring MVC依赖。例如&#xf…...

CSS3设计动画样式

CSS3动画包括过渡动画和关键帧动画,它们主要通过改变CSS属性值来模拟实现。我将详细介绍Transform、Transitions和Animations 3大功能模块,其中Transform实现对网页对象的变形操作,Transitions实现CSS属性过渡变化,Animations实现…...

AtCoder abc 144

D - Water Bottle x先除以a,得到面积。体积和面积是等同考虑的。 分两种情况,一种是水比一半面积少,一种是水比一半面积多。 # -*- coding: utf-8 -*- # time : 2023/6/2 13:30 # author : yhdutongwoo.cn # desc : # file : …...

【开题报告】基于SpringBoot的医美在线预约系统的设计与实现

1.研究背景 医美行业是指结合医学和美容技术,为人们提供外貌改善和整容手术等服务的领域。随着社会经济的发展和人们审美观念的变化,医美行业得到了快速的发展,并受到越来越多人的关注和需求。 传统的医美预约方式主要依赖于电话预约或现场…...

AutoGen agent使用;调用本地LLM

参考: https://microsoft.github.io/autogen 安装: pip install pyautogen 代码 本地LLM部署可以用fastchat、vllm等框架部署openai接口: from autogen import AssistantAgent, UserProxyAgent, oai ## 调用本地模型对外的openai接口 conf…...

Docker安装matomo

Docker安装matomo 文章目录 Docker安装matomo1.安装Docker2.matomo安装 1.安装Docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.matomo安装 #拉取matomo镜像 docker pull matomo#启动matomo容器 docker run -d --name matomo -p 8093:80 -v /do…...

副对角线以上和以下都为0的行列式求解

...

DSP开发例程(4): logbuf_print_to_uart

目录 DSP开发例程: logbuf_print_to_uart新建工程源码编辑app.cfgos.cmain.c 调试说明 DSP开发例程: logbuf_print_to_uart SYS/BIOS 提供了 xdc.runtime.Log, xdc.runtime.LoggerBuf 和 xdc.runtime.LoggerSys 这几个模块用于日志记录. 日志信息在 应用程序调试和状态监控中非…...

计算机毕业设计选题推荐-超市售货微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

Azure 机器学习 - 使用 Visual Studio Code训练图像分类 TensorFlow 模型

了解如何使用 TensorFlow 和 Azure 机器学习 Visual Studio Code 扩展训练图像分类模型来识别手写数字。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员…...

Vue 创建自定义 ref 函数

Vue 创建自定义 ref 函数 customRef customRef 用于:创建一个自定义的 ref 函数,并对其依赖项跟踪和更新触发进行显式控制。 使用 customRef 创建自定义 ref 函数 // 创建自定义 ref 函数 function myRef(value) {return customRef((track, trigger) &…...

[2016-2018]phpstudy的exp制作

[2016-2018]phpstudy的exp制作 用python的requests模块进行编写 修改请求数据包进行远程代码执行 import requests import base64 def remove_code_execute():try:url input("请输入要测试的网址:")cmd input("想要执行的命令:")cmd f"system({…...

服务器数据恢复—Zfs文件系统下文件被误删除的如何恢复数据?

服务器故障: 一台zfs文件系统服务器,管理员误操作删除服务器上的数据。 服务器数据恢复过程: 1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…...

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了,近一年都在某个国企里工作,我做的就是嵌入式工程师的岗位,最近才刚刚退出来,想来说说自己的工作使用的软件和系统。 本身进公司的时候,其实做的就是写单片机的板子的程序的工作&#x…...

在Ubuntu上安装Redis并学习使用get、set和keys命令

目录 安装Redis切换到root用户搜索redis相关软件包安装redis修改配置文件重启服务器使用redis客户端连接服务器 get与set命令keys 安装Redis 我们在Ubuntu20.04上进行Redis的安装 切换到root用户 使用su命令: 在终端中,输入su并按回车键。然后输入roo…...

Ubuntu更换镜像源

Ubuntu更换镜像源 镜像源设置文件镜像源设置focal版本镜像源设置bionic版本镜像源设置 更新源问题 镜像源设置文件 备份镜像源设置文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑镜像源设置文件 sudo gedit /etc/apt/sources.list镜像源设置 Ubuntu有不…...

Sora 2生成帧精度达99.7%的LUT匹配方案,DaVinci色彩科学全链路对齐指南

更多请点击: https://kaifayun.com 第一章:Sora 2与DaVinci整合的底层逻辑与技术共识 Sora 2 作为新一代视频生成基础模型,其核心能力建立在时空联合建模与长程依赖捕获之上;DaVinci 则是面向专业影视工作流的高性能非线性编辑与…...

5G网络切换实战:当gNB之间没有Xn接口时,N2/NGAP切换如何保证你的游戏不掉线?

5G网络无缝切换实战:无Xn接口场景下的高可靠连接方案 手游玩家小张正沉浸在激烈的团战中,突然屏幕右上角的延迟数字从30ms飙升至500ms——角色瞬间卡顿,等他重新恢复操作时,团队已经团灭。这种场景在5G时代本应成为历史&#xff0…...

夹矸煤层采煤机螺旋滚筒工作性能优化【附代码】

✨ 长期致力于夹矸煤层、螺旋滚筒、工作性能、可靠性、多目标优化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)离散元-有限元耦合截割模型与煤岩参…...

保姆级教程:在ROS2 Humble上,用Orbbec Astra Pro深度相机搞定单目标定(附常见镜像问题解决)

保姆级教程:ROS2 Humble与Orbbec Astra Pro深度相机单目标定实战指南 深度相机在机器人视觉、三维重建等领域扮演着关键角色,而精确的相机标定则是确保数据可靠性的第一步。本文将手把手带你完成Orbbec Astra Pro在ROS2 Humble环境下的单目标定全流程&am…...

告别FPN信息瓶颈:手把手图解Gold-YOLO的‘聚合-分发’机制(附代码逐行解读)

告别FPN信息瓶颈:手把手图解Gold-YOLO的‘聚合-分发’机制(附代码逐行解读) 在目标检测领域,YOLO系列模型凭借其出色的实时性能一直占据主导地位。然而,随着应用场景的复杂化,传统特征金字塔网络&#xff…...

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’ 当一块电路板上的BGA焊点出现异常时,往往就像人体某个关节出了问题——表面看不出明显伤痕,但功能已经受限。这时候,我们需要像医生一样,用专业设备给焊…...

终极性能释放指南:3步解锁暗影精灵完整潜力,告别臃肿官方软件

终极性能释放指南:3步解锁暗影精灵完整潜力,告别臃肿官方软件 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否厌倦了官方Ome…...

从选型到设计:手把手教你根据7系列FPGA数据手册做项目选型(以Kintex-7为例)

从选型到设计:手把手教你根据7系列FPGA数据手册做项目选型(以Kintex-7为例) 在硬件系统设计中,FPGA选型往往决定着项目的成败。面对Xilinx 7系列丰富的产品线,工程师需要像外科医生选择手术器械一样精准——既要考虑当…...

Go语言性能分析:pprof与trace

Go语言性能分析:pprof与trace 1. pprof使用 import ("net/http/pprof"_ "net/http/pprof" )func main() {http.ListenAndServe(":6060", nil) }2. trace使用 import "runtime/trace"func main() {f, _ : os.Create("t…...

哪家网卡公司靠谱必看5大关键清单 企业采购专属版

选网卡公司的3个常见决策误区很多企业采购网卡时踩坑,往往是陷入了三个常见的决策误区。第一个误区是唯价格论,过度压低采购预算,优先选择报价较低的供应商,忽略了产品的授权资质和正品保障,后续容易买到翻新、贴牌的不…...