第六課:數據庫集成:MongoDB與Mongoose技術應用

本文詳細介紹了如何在Node.js應用程序中集成MongoDB數據庫,并使用Mongoose庫進行數據操作。我們將涵蓋MongoDB在Ubuntu 20系統中的安裝、Bash命令的CRUD操作、Mongoose數據建模(Schema/Model)、關聯查詢與聚合管道,以及實戰案例——用戶注冊系統的開發。通過本文,你將掌握Node.js與MongoDB集成的完整流程。

1. MongoDB在Ubuntu 20系統中安裝與Bash命令的CRUD操作

1.1 MongoDB安裝

在Ubuntu 20系統中安裝MongoDB,你可以通過以下步驟進行:

方法一:直接安裝

導入公共GPG密鑰

wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -

創建MongoDB源列表文件

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

更新軟件包列表并安裝MongoDB

sudo apt-get updatesudo apt-get install -y mongodb-org

啟動MongoDB服務

sudo systemctl start mongodsudo systemctl enable mongod

方法二:使用Docker鏡像

如果你更喜歡使用Docker來管理MongoDB,可以使用以下命令:

docker pull mongodocker run -itd --name mongo_latest -p 27017:27017 mongo

然后,你可以通過docker exec -it mongo_latest mongosh進入MongoDB shell

1.2 Bash命令的CRUD操作

增操作

mongouse myDatabasedb.users.insert({name: "deming_su", age: 22, email: "deming_su@163.com"})

查操作

db.users.find()

更操作

db.users.updateOne({name: "deming_su"}, {$set: {age: 23}})

刪操作

db.users.deleteOne({name: "deming_su"})

2. Mongoose數據建模(Schema/Model)

2.1 Mongoose安裝

首先,確保你的Node.js環境已經安裝完畢,然后通過npm安裝Mongoose:

npm install mongoose

2.2 定義Schema

Schema是Mongoose中用于定義文檔結構的藍圖。以下是一個簡單的用戶Schema示例:

const mongoose = require('mongoose');const userSchema = new mongoose.Schema({id: String,name: String,age: Number,email: {type: String,unique: true}
});
2.3 創建Model

Model是Schema的編譯版本,用于創建和操作數據庫中的文檔。你可以使用mongoose.model方法創建Model:

const User = mongoose.model('User', userSchema);
2.4 CRUD操作

使用Mongoose進行CRUD操作非常簡單。以下是一些示例:

增操作

const mongoose = require('mongoose');
const User = require('./models/user');mongoose.connect('mongodb://localhost:27017/myDatabase', {useNewUrlParser: true,useUnifiedTopology: true
});const newUser = new User({id: "deming_su", name: "deming_su", age: 28, email: "deming_su@163.com"});newUser.save();

查操作

User.find({id: "deming_su"}, (err, users) => {if (err) {console.error(err);} else {console.log(users);}
});

更操作

User.findByIdAndUpdate('deming_su', {$set: {age: 29}}, (err, user) => {if (err) {console.error(err);} else {console.log(user);}
});

刪操作

User.findByIdAndDelete('deming_su', (err, user) => {if (err) {console.error(err);} else {console.log(user);}
});

3. 關聯查詢與聚合管道

3.1 關聯查詢

在MongoDB中,關聯查詢通常通過$lookup操作符在聚合管道中實現。假設我們有兩個集合:users和orders,每個訂單都屬于一個用戶,我們可以通過user_id字段進行關聯查詢。

User.aggregate([{$lookup: {from: 'orders',localField: '_id',foreignField: 'user_id',as: 'orders'}}
]).exec((err, users) => {if (err) {console.error(err);} else {console.log(users);}
});
3.2 聚合管道

聚合管道允許你對集合中的文檔進行一系列復雜的轉換和聚合操作。以下是一個簡單的聚合管道示例,用于統計每個用戶的訂單總數:

Order.aggregate([{$group: {_id: '$user_id',totalOrders: { $sum: 1 }}}
]).exec((err, results) => {if (err) {console.error(err);} else {console.log(results);}
});

4. 實戰:用戶注冊系統開發

4.1 系統設計

用戶注冊系統需要實現以下功能:

  • 用戶注冊:收集用戶信息(如用戶名、密碼、郵箱等)并保存到數據庫。
  • 用戶登錄:驗證用戶信息并登錄系統。
  • 用戶注銷:清除用戶會話并注銷系統。
4.2 數據建模

首先,我們需要定義用戶數據模型。使用Mongoose,我們可以創建一個簡單的用戶Schema:

const mongoose = require('mongoose');const userSchema = new mongoose.Schema({username: {type: String,required: true,unique: true},password: {type: String,required: true},email: {type: String,required: true,unique: true}
});
4.3 實現注冊功能

前端(HTML + JavaScript)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>User Registration</title>
</head>
<body><form id="registerForm"><label for="username">Username:</label><input type="text" id="username" name="username" required><br><br><label for="password">Password:</label><input type="password" id="password" name="password" required><br><br><label for="email">Email:</label><input type="email" id="email" name="email" required><br><br><button type="submit">Register</button></form><script>document.getElementById('registerForm').addEventListener('submit', async function(event) {event.preventDefault();const username = document.getElementById('username').value;const password = document.getElementById('password').value;const email = document.getElementById('email').value;const response = await fetch('/register', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ username, password, email })});const result = await response.json();if (result.success) {alert('Registration successful!');} else {alert('Registration failed: ' + result.message);}});</script>
</body>
</html>

后端(Node.js + Express + Mongoose)

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');const app = express();
const port = 3000;mongoose.connect('mongodb://localhost:27017/userRegistration', {useNewUrlParser: true,useUnifiedTopology: true
});app.use(bodyParser.json());const User = require('./models/user');app.post('/register', async (req, res) => {const { username, password, email } = req.body;try {const user = new User({ username, password, email });await user.save();res.json({ success: true });} catch (err) {res.json({ success: false, message: err.message });}
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
4.4 實現登錄和注銷功能

登錄和注銷功能的實現與注冊類似,這里不再贅述。你可以參考上述代碼,通過發送POST請求到/login和/logout端點來實現用戶登錄和注銷功能。

結語

通過本文,你了解了如何在Node.js應用程序中集成MongoDB數據庫,并使用Mongoose庫進行數據操作。我們涵蓋了MongoDB的安裝、Bash命令的CRUD操作、Mongoose數據建模、關聯查詢與聚合管道,以及實戰案例——用戶注冊系統的開發。希望這些內容對你有所幫助,讓你能夠更好地掌握Node.js與MongoDB的集成技術。

關注我!!🫵 持續為你帶來Nodejs相關內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71678.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據學習(56)-Impala

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 承認自己的無知&#xff0c;乃是開啟智慧的大門 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91…

【C#】async與await介紹

1. 實例1 1.1 代碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();Method2();Console.ReadKey();}public static…

【大模型基礎_毛玉仁】1.1 基于統計方法的語言模型

【大模型基礎_毛玉仁】1.1 基于統計方法的語言模型 1.語言模型基礎1.1 基于統計方法的語言模型1.1.1 n-grams 語言模型1.1.2 n-grams 的統計學原理 1.語言模型基礎 語言是概率的。語言模型&#xff08;LanguageModels, LMs&#xff09;旨在準確預測語言符號的概率。 將按照語…

JavaScript(最后一個元素的索引就是數組的長度減 1)array.length - 1

在不同的編程語言中&#xff0c;表示數組中最后一個元素的方法略有不同&#xff0c;但基本思路都是利用數組的長度或索引來實現。 以下是一些常見編程語言中獲取數組最后一個元素的方法&#xff1a; 1. JavaScript: 使用 array.length - 1 索引: 這是最常見和傳統的方法。Java…

SpringCloud中使用服務名調用場景總結

一 API Gateway 在 Spring Cloud API Gateway 中&#xff0c;通過使用 lb:// 前綴可以實現基于服務名的負載均衡路由。以下是具體的配置和使用方法&#xff1a; 1. 配置服務注冊與發現 確保你的服務已經注冊到服務注冊中心&#xff08;如 Nacos 或 Eureka&#xff09;。API …

7V 至 30V 的超寬 VIN 輸入范圍,轉換效率高達 96%的WD5030

WD5030 具備 7V 至 30V 的超寬 VIN 輸入范圍&#xff0c;這一特性使其能夠適應多種不同電壓等級的供電環境&#xff0c;無論是在工業設備中常見的較高電壓輸入&#xff0c;還是在一些便攜式設備經過初步升壓后的電壓&#xff0c;WD5030 都能輕松應對&#xff0c;極大地拓展了應…

深度學習模型Transformer核心組件—自注意力機制

第一章&#xff1a;人工智能之不同數據類型及其特點梳理 第二章&#xff1a;自然語言處理(NLP)&#xff1a;文本向量化從文字到數字的原理 第三章&#xff1a;循環神經網絡RNN&#xff1a;理解 RNN的工作機制與應用場景(附代碼) 第四章&#xff1a;循環神經網絡RNN、LSTM以及GR…

利用Ollama+AnythingLLM+本地向量數據庫Milvus+本地DeepSeek大模型實現知識庫的搭建

1. Ollama的搭建 基本介紹 Ollama是一個支持在Windows、Linux和MacOS上本地運行大語言模型的工具。它允許用戶非常方便地運行和使用各種大語言模型,比如Qwen模型等。用戶只需一行命令就可以啟動模型。 Ollama 下載&#xff1a;https://ollama.com/download Ollama 官方主頁&a…

如何搭建個人靜態住宅IP:從零開始

你好&#xff01;今天我們將一起探索如何從頭開始搭建個人靜態住宅IP。無論您是為了遠程辦公、在線教育還是游戲加速&#xff0c;靜態住宅IP都能帶給您更穩定的網絡體驗。 一、準備階段 1. 明確需求 首先&#xff0c;您需要清楚自己為什么需要靜態住宅IP。可能是為了實現遠程…

國產編輯器EverEdit - 安裝擴展功能的方式

1 擴展管理 1.1 應用場景 由于各行各業工作場景的不同&#xff0c;編輯器不可能為所有行業都定制功能&#xff0c;因此&#xff0c;對于一些特殊的行業應用場景&#xff0c;某些資深工程師可能已經做了一些擴展&#xff0c;并分享到了共享平臺&#xff0c;普通工程師可以安裝這…

CUDA計時函數:精確測量GPU代碼執行時間

在GPU編程中&#xff0c;精確測量代碼執行時間是性能優化的關鍵步驟。CUDA提供了專門的計時工具來幫助開發者準確獲取核函數&#xff08;Kernel&#xff09;、內存拷貝等操作的耗時。本文將詳細介紹CUDA計時函數的使用方法&#xff0c;并通過實例代碼演示如何高效測量GPU代碼的…

Go語言集成DeepSeek API和GoFly框架文本編輯器實現流式輸出和對話(GoFly快速開發框架)

說明 本文是GoFly快速開發框架集成Go語言調用 DeepSeek API 插件&#xff0c;實現流式輸出和對話功能。為了方便實現更多業務功能我們在Go服務端調用AI即DeepSeek接口&#xff0c;處理好業務后再用Gin框架實現流失流式輸出到前端&#xff0c;前端使用fetch請求接收到流式的mar…

SAP服務器進程預警通知

在財務月結&#xff0c;HR薪資核算等系統用戶集中使用高峰時期。通過判斷判斷當前系統可用的并行對話框進程數&#xff0c;用戶使用過多給出提示&#xff0c;服務器進程預警通知。 1. 根據配置的進程最大可使用率80%&#xff0c;根據進程數判斷&#xff1a;當進程可用數少于20%…

【Java代碼審計 | 第四篇】SQL 注入防范

文章目錄 Java SQL 注入防御方法類型轉換預編譯查詢&#xff08;PreparedStatement&#xff09;使用 ORM 框架&#xff08;如 MyBatis、Hibernate&#xff09;白名單限制ORDER BY 語句LIKE 語句 限制數據庫權限過濾和轉義特殊字符監控與日志審計使用 Web 應用防火墻&#xff08…

軟考中級-數據庫-3.3 數據結構-樹

定義:樹是n(n>=0)個結點的有限集合。當n=0時稱為空樹。在任一非空樹中,有且僅有一個稱為根的結點:其余結點可分為m(m>=0)個互不相交的有限集T1,T2,T3...,Tm…,其中每個集合又都是一棵樹,并且稱為根結點的子樹。 樹的相關概念 1、雙親、孩子和兄弟: 2、結點的度:一個結…

選擇排序算法的SIMD優化

一、優化原理 將查找數組最小值索引的SIMD優化的函數嵌入選擇排序主循環,優化最耗時的最小值查找環節,同時保留選擇排序的交換邏輯。 二、關鍵改造步驟 1)最小值查找模塊化 復用SIMD優化的 find_min_index_simd函數。 2)動態子數組處理 每次循環處理 arr[i..n-1] 子數…

考網絡安全工程師證要什么條件才能考?

在當今數字化時代&#xff0c;網絡安全問題日益凸顯&#xff0c;網絡安全工程師成為了一個備受矚目的職業。許多有志于投身這一行業的學子或職場人士&#xff0c;都希望通過考取網絡安全工程師證書來提升自己的專業素養和競爭力。那么&#xff0c;考網絡安全工程師證需要具備哪…

uniapp項目運行失敗Error: getaddrinfo *.bspapp.com 文件查找失敗uview-ui及推薦MarkDown軟件 Typora

一、uniapp項目運行失敗Error: getaddrinfo *.bspapp.com 文件查找失敗uview-ui 在運行一個uniapp項目時&#xff0c;出現報錯 文件查找失敗&#xff1a;uview-ui&#xff0c;Error: getaddrinfo ENOTFOUND 960c0a.bspapp.com。hostname異常&#xff0c;報錯的詳細信息如下&…

使用阿里云 API 進行聲音身份識別的方案

使用阿里云 API 進行聲音身份識別的方案 阿里云提供 智能語音交互&#xff08;智能語音識別 ASR&#xff09; 和 聲紋識別&#xff08;說話人識別&#xff09; 服務&#xff0c;你可以利用 阿里云智能語音 API 進行 說話人識別&#xff0c;實現客戶身份驗證。 方案概述 準備工…

【Pandas】pandas Series unstack

Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…