nodejs 集成mongodb实现增删改查

初始化项目:
npm init -y
npm install mongoose -save 安装mongoose 插件
mongoose 链接数据库语法:
mongodb://[username:password@]host1[:poert1],host2[:port2]…/[databsase]?[options…]

userame: 用户名
passwrod: 密码
host1:port1,host2:port2… 链接地址,mongodb 支持分布式高可用集群模式,可以有多个地址
database : 数据库名称
?options: 可以选择的get形式的的连接选项。例如poolSize=10&replicatSet=student

options 的可选内容如下:
useNewUrlParse 布尔值使用新版本的url解析器来解析链接字符串
reconnectTries 数值型 ,重连次数
reconnectInterval 数值型 重连间隔 单位是毫米
poolSize 数值 连接池大小

本地链接mongodb 示例:

const mongoose = require(‘mongoose’);
async function connect() {
try {
await mongoose.connect(‘mongodb://localhost:27017/student’,{
useNewUrlParser: true
});
console.log(‘数据库链接成功’);
} catch (error) {
console.log(‘数据库链接失败’+error);
}
}
connect();

(node:7252) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version
(Use node --trace-warnings ... to show where the warning was created)
数据库链接成功

mongoose 的相关概念:
Schema 模型的骨架,可以用来生成模型类,通过模型类可以生成文档
Model 由Schema 产生的构造器,具有属性和行为,,model的每一个实例就是一个Mongodb的document
Instance model的实例,通过new Model()得到

Schema 的语法:
const schema = new Schema({字段名:字段类型});
const schema = new Schema({字段名:选项});

字段类型如下:
String Boolean Number Date Object Array
选项是高度自定义的方式,可以定义字段必填,默认值等属性
,支持的属性如下:
type 数据类型
default 默认值
index 索引选项
backgroup 是否后台创建
unique 是否唯一索引
required 是否必填
unique 是否唯一索引
min 最小值
max 最大值

Schema 实例

const Post = new Schema({
title: { type: String, required: true, unique: true },
content: { type: String, required: true },
createTime: { type: Date, default: new Date(), index: { background: false, unique: true } },
tags: [String], //数组
published: Boolean,
meta: {
praise: Number,
comments: Number
}
});

定义实例方法:语法如下
schema.methods.方法名 = function(参数){
//业务代码
}

在上面的Post 实例代码中添加 实例方法

const mongoose = require(‘mongoose’);
async function connect() {
try {
await mongoose.connect(‘mongodb://localhost:27017/student’,{
useNewUrlParser: true
});
console.log(‘数据库链接成功’);
} catch (error) {
console.log(‘数据库链接失败’+error);
}
}

connect();

const Post = new Schema({
title: { type: String, required: true, unique: true },
content: { type: String, required: true },
createTime: { type: Date, default: new Date(), index: { background: false, unique: true } },
tags: [String], //数组
published: Boolean,
meta: {
praise: Number,
comments: Number
}
});

//定义实例方法
Post.methods.getPraise = function(){
return this.meta.praise;
}

const Model = mongoose.model(‘Post’,Post);
const news = new Model();
news.meta = {praise: 0 ,comments:1};

console.log(news.getPraise());

==================================================
nodejs + mongodb + Schema + model 实现怎删改查

npm init -y
npm install express mongoose dotenv
npm install -D nodemon 热部署插件

添加目录结构:
在这里插入图片描述
models/User.js 定义实例对象和方法 类似于java 里面一个普通的pojo

const mongoose = require(‘mongoose’);

const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
unique: true,
lowercase: true
},
age: {
type: Number,
min: 0
},
isActive: {
type: Boolean,
default: true
},
createdAt: {
type: Date,
default: Date.now
}
});

// 可添加实例方法
userSchema.methods.getUserInfo = function() {
return Name: ${this.name}, Email: ${this.email}, Active: ${this.isActive};
};

// 可添加静态方法
userSchema.statics.findActiveUsers = function() {
return this.find({ isActive: true });
};

// 可添加查询助手
userSchema.query.byName = function(name) {
return this.where({ name: new RegExp(name, ‘i’) });
};

module.exports = mongoose.model(‘User’, userSchema);

routes/users.js 定义路由方法

const express = require(‘express’);
const router = express.Router();
const User = require(‘…/models/User’);

// CREATE - 创建新用户
router.post(‘/’, async (req, res) => {
try {
const user = new User(req.body);
const savedUser = await user.save();
res.status(201).json({
success: true,
data: savedUser,
message: ‘User created successfully’
});
} catch (error) {
if (error.name === ‘ValidationError’) {
const errors = Object.values(error.errors).map(err => err.message);
return res.status(400).json({
success: false,
message: ‘Validation error’,
errors
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// READ - 获取所有用户
router.get(‘/’, async (req, res) => {
try {
const { name, active } = req.query;
let query = User.find();
// 查询条件示例
if (name) {
query = query.byName(name);
}
if (active !== undefined) {
query = query.where(‘isActive’).equals(active === ‘true’);
}

const users = await query.sort({ createdAt: -1 });
res.json({success: true,count: users.length,data: users
});

} catch (error) {
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// READ - 根据ID获取单个用户
router.get(‘/:id’, async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) {
return res.status(404).json({
success: false,
message: ‘User not found’
});
}
res.json({
success: true,
data: user
});
} catch (error) {
if (error.name === ‘CastError’) {
return res.status(400).json({
success: false,
message: ‘Invalid user ID’
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// UPDATE - 更新用户
router.put(‘/:id’, async (req, res) => {
try {
const user = await User.findByIdAndUpdate(
req.params.id,
req.body,
{
new: true, // 返回更新后的文档
runValidators: true // 运行验证
}
);

if (!user) {return res.status(404).json({success: false,message: 'User not found'});
}res.json({success: true,data: user,message: 'User updated successfully'
});

} catch (error) {
if (error.name === ‘ValidationError’) {
const errors = Object.values(error.errors).map(err => err.message);
return res.status(400).json({
success: false,
message: ‘Validation error’,
errors
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

// DELETE - 删除用户
router.delete(‘/:id’, async (req, res) => {
try {
const user = await User.findByIdAndDelete(req.params.id);
if (!user) {
return res.status(404).json({
success: false,
message: ‘User not found’
});
}
res.json({
success: true,
message: ‘User deleted successfully’
});
} catch (error) {
if (error.name === ‘CastError’) {
return res.status(400).json({
success: false,
message: ‘Invalid user ID’
});
}
res.status(500).json({
success: false,
message: ‘Server error’,
error: error.message
});
}
});

module.exports = router;

.env 文件保存服务中所需要的配置项
创建一个.env 文件 加入如下内容

MONGODB_URI=mongodb://localhost:27017/student
PORT=3000

app.js 定义服务入口,包括组件引入,路由挂载,配置加载和服务启动等功能

const express = require(‘express’);
const mongoose = require(‘mongoose’);
const path = require(‘path’);
require(‘dotenv’).config();

//const userRoutes = require(‘./routes/users’);
// 正确导入路由 - 使用绝对路径
const userRoutes = require(path.join(__dirname, ‘routes’, ‘users’));

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(express.json());

// 连接 MongoDB
mongoose.connect(process.env.MONGODB_URI || ‘mongodb://localhost:27017/student’, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log(‘Connected to MongoDB’))
.catch(err => console.error(‘Could not connect to MongoDB:’, err));

// 路由
app.use(‘/api/users’, userRoutes);

// 启动服务器
app.listen(PORT, () => {
console.log(Server is running on port ${PORT});
});

遇到的问题:
https://dotenvx.com/radar
c:\Users\Lei.Wang170\Desktop\project\node_modules\router\index.js:151
throw new TypeError(‘argument callback is required’)
解决步骤:

1. 卸载有问题的包

npm uninstall router

2. 清理 node_modules(如果问题持续)

rm -rf node_modules package-lock.json

3. 清理 npm 缓存

npm cache clean --force

4. 重新安装正确依赖

npm install express mongoose dotenv

5. 安装开发依赖

npm install --save-dev nodemon

还有需要在package.json 中添加
“scripts”: {
“start”: “node app.js”,
“dev”: “nodemon app.js”,
“test”: “echo “Error: no test specified” && exit 1”
}

6. 启动开发服务器

npm run dev
在这里插入图片描述

测试结果:
在这里插入图片描述
查询接口返回数据
在这里插入图片描述
命令行查看结果:
在这里插入图片描述
视图工具查看结果:
在这里插入图片描述

其他Api 的用法:
官网路径:
mongoose:
https://www.mongodb.com/zh-cn/docs/drivers/node/current/integrations/mongoose-get-started/

nodejs
https://nodejs.p2hp.com/api/v19/documentation/

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

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

相关文章

音视频学习(五十八):STAP-A模式

什么是 STAP-A? STAP-A 是一种特殊的 RTP 封装机制,专为 H.264 和 H.265 这类视频编码协议设计。它的核心目的只有一个:将多个小的 NALU(网络抽象层单元)打包进一个 RTP 包中,以此来减少网络开销&#xff0…

管理型交换机通过VLAN划分实现不同IP跨网段通信配置方法

管理型交换机应用场景丰富,如果要实现不同IP跨网段通信(比如172.22.106.X和192.168.100.X实现通信),通过VLAN划分是可以满足,下面分享基于弱三层交换机RTL9301方案核心模块SW-24G4F-301EM配置方法! 1. 一般结合交换机的应用场景&a…

什么是高防服务器?如何进行防御?

高防服务器是指能为用户提供防御网络攻击,是主要针对DDOS等流量型攻击能力的服务器,通过部署专业的硬件设备与软件系统,具备高带宽、大流量清洗能力,能有效抵御各类恶意流量冲击,确保服务器稳定运行,保障网…

SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度

文章目录SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度概述笔记SW版本导出时,选择STL的导出选项默认导出(精细)导出粗糙自定义导出 - 将误差和角度改为最大自定义导出 - 将误差,角度,三角面数改为最大备注这几天的感想关于我不参考人家零件&…

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例 前言 准备工作 第一部分:后端实现 - OpenAPI 解析与批量创建 API 1. 创建 OpenAPI 解析服务 2. 创建批量用例导入 API 3. 注册新 API 路由 第二部分:前端实现 - OpenAPI 导入界面 1. 更新 `api/testca…

K8S-Service资源对象

一、概述在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也为大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并创建闪烁 LED 任务 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么? RT-Thread 是一个开源、轻量级的实时操作系统,适用于…

基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程)

目录 基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程) 超实用的Paddle图像分类训练推理教程,助力深度学习研究! 1、环境准备(重要⭐⭐⭐) 构建虚拟环境 安装PaddlePaddle 安装PaddleX 安装PaddleClas插件 2…

Mistral AI音频大模型Voxtral解读

1. 引言 传统的语音处理系统(如OpenAI的Whisper)在ASR任务上取得了巨大成功,能将语音高精度地转换为文本。但这只是第一步。真正的“语音理解”意味着: 内容推理:不仅知道说了什么,还能理解话语背后的含义、情感和意图。 长篇摘要:能够听完一段长达数十分钟的播客或会议…

使用Docker+WordPress部署个人博客

一、通过docker compose 自动一键部署WordPress 1. 准备工作 安装 Docker 和 Docker Compose确保服务器有公网 IP(如果需要外部访问)域名(可选,用于绑定网站) 2. 创建 Docker Compose 配置文件 创建一个docker-compose…

http与https配置

Web 服务详解:HTTP 与 HTTPS 配置 一、HTTP 服务概述 HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在网络上传输网页数据的基础协议,默认使用80 端口,以明文形式传输数据。常见的 HTTP 服务软件…

Python爬虫实战:研究amazon-scrapy,构建亚马逊电商数据采集和分析系统

1 引言 1.1 研究背景 电子商务的高速发展使电商平台成为数据价值的核心载体。亚马逊作为全球领先的电商生态,截至 2024 年第二季度,其平台商品总量突破 1.5 亿,日均活跃用户超 3 亿,每日产生 PB 级的交易数据与用户行为记录。这些数据包含商品特征(价格、规格、品牌)、…

基于ERNIE 4.5的多智能体协作的自动化视频舆情分析报告生成器

多智能体协作的自动化视频舆情分析报告生成器 1. 项目的意义与价值 从“非结构化视频”中挖掘“结构化洞察”的通用挑战 在当今的数字生态中,视频已成为信息传播、知识分享和消费者意见表达的核心媒介。从企业内部的会议录屏、技术培训,到外部的市场宣传…

Java全栈开发面试实录:从基础到实战的深度解析

Java全栈开发面试实录:从基础到实战的深度解析 面试官与应聘者的对话记录 第一轮:基础问题与项目背景 面试官(中年男性,穿着整洁): 你好,欢迎来到我们公司。我是今天的面试官,可以先…

如何清除webview138、139版本软键盘占用的区域

好的,这个问题非常具体且关键。在 Android System WebView 的 138 和 139 版本(基于 Chromium 113)的上下文中,“清除软键盘占用的区域”通常意味着:在软键盘收起后,WebView 的布局或视口没有正确恢复&…

深度学习:卷积神经网络(CNN)

文章目录一、CNN 基础认知1.1 图像在计算机中的存储形式1.2 图像识别的核心需求:画面不变性1.3 传统神经网络的局限二、CNN 核心原理:三大核心层与关键操作2.1 卷积层(1)什么是卷积操作?(2)卷积…

iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持

在之前的 《Flutter 又双叒叕可以在 iOS 26 的真机上 hotload》 和 《Flutter 在 iOS 真机 Debug 运行出现 Timed out *** to update》 我们聊过,由于 iOS 26 开始,Apple 正式禁止了 Debug 时 mprotect 的 RX 权限,导致了 Flutter 在 Debug 运…

机器学习全流程拆解 _ 从数据到模型的科学之道

-—— 避开80%项目失败的隐形成本,掌握高效建模方法论*📌 一、明确目标:成败的起点 1. 问题定位 分类任务:区分二分类/多分类/多标签分类预测任务:标量预测(如房价)vs 向量预测(如股…

Android 广告轮播全实现:图片与视频混合展示的完整方案

广告轮播是移动应用中提升用户转化率的核心组件,尤其在电商、资讯类应用中应用广泛。传统轮播仅支持图片展示,而现代应用需要兼顾图片和视频内容以增强吸引力。本文将详细讲解如何实现一个支持图片与视频混合播放的高性能广告轮播,涵盖布局设…

AI大模型企业落地指南-笔记01

前言AI技术的发展趋势必然是越来越普及,越来越“技术平权”的。在未来10年内,AI将以各种方式“融入”人类世界,与人类乃至世界深度融合。一. 概念第1章 AI与大模型概述1.1 什么是AI人工智能(全称Artificial Intelligence&#xff…