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

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...