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
英文地址,請注明出處:http://en.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…