当前位置: 首页 > 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有不…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...