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

Sulfo-CY5 NHS荧光染料的生物应用2230212-27-6星戈瑞

Sulfo-CY5 NHS ester是一种用于生物学和生物医学研究中的荧光染料,它在生物应用方面具有许多重要用途,包括但不限于以下几个方面: **生物标记:**Sulfo-CY5 NHS ester可以与生物分子(如抗体、蛋白质、核酸等&#xff09…...

Python Django 之模板继承详解(extends)

文章目录 1 概述1.1 目的1.2 标签:block、extends1.3 目录结构 2 templates 目录2.1 base.html:父页面2.2 login.html:子页面 3 其它代码3.1 settings.py3.2 views.py3.3 urls.py 1 概述 1.1 目的 模板继承 和 类继承 的目的是一样的&#…...

混合式ANC主动降噪耳机系统设计(含C源代码)

混合式ANC主动降噪耳机系统设计(含C源代码) 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙音频,DSP音频项目核心开发资料, 1 FF信号链路与FB 链路算法处理上一样 X(n)为噪声输…...

Linux查看磁盘、内存、cpu信息

1. 查看磁盘空间信息:lsblk 2. 查看内存信息:awk $3"kB"{$2$2/1024^2;$3"GB";} 1 /proc/meminfo | column -t 3. 查看cup相关信息:lscup...

C语言 强制类型转换的各种代码示例

在C语言中,强制类型转换可以通过使用类型转换运算符来完成。以下是一些关于C语言强制类型转换的代码示例: int num 10; float fnum (float) num; // 将整数num转换为浮点数float fnum 3.14; int num (int) fnum; // 将浮点数fnum转换为整数&a…...

python 二维码使用

python 二维码使用 segno官网...

uniapp的启动页、开屏广告

uniapp的启动页、开屏广告 启动页配置广告开屏 启动页配置 在manifest.json文件中找到APP启动界面配置,可以看到有Android和iOS的启动页面的配置 ,选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…...

基于人工势场法的航线规划

GitHub - zzuwz/Artificial-Potential-Field: 2D平面下的人工势场法 GitHub - mellody11/Artificial-Potential-Field: 机器人导航--人工势场法及其改进 matlab2020a可以运行...

在紫光同创盘古50K开发板上进行DDR读写测试

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL50H开发平台(盘古50K开发板) 一:软硬件平台 软件平台:PDS_…...

MySQL BinLog实战应用之二

一、前言 上篇 MySQL Binlog实战应用之一 主要讲了BinLog的开启以及用MySQLBinLog读取BigLog二进制文件,但MySQLBinLog很难直接对接Java,所以有了Canal这个Alibaba开发的用于MySQL增量日志解析,提供增量数据的订阅和消费组件。 二、Canal原…...