MongoDB、Mongoose使用教程
文章目录
- 一:MongoDB 简介
- 1.1 什么是 MongoDB
- 1.2 特点
- 1.3 与关系数据库的区别:
- 1.4 资源链接:
- 二:安装 MongoDB
- 2.1 安装前的准备
- 2.2 安装、启动 MongoDB
- 2.3 创建用户 MongoDB
- 三、连接
- 四:MongoDB 基础操作
- 4.1 库操作:
- 4.2 集合操作
- 4.3 文档操作
- 查询
- 编辑
- 删除
- 排序
- 文档关联
- 引用:
- 五:Mongoose 使用
- 5.1 Mongoose 介绍
- 5.2 安装
- 5.3 引入
- 5.4 建立链接
- 5.5 创建模式
- 5.6 创建模型
- 5.7 查询数据库, 查看已什么开头的名字
- 5.8 增删查改
- 六:备份 、恢复数据
- 七:结语
一:MongoDB 简介
1.1 什么是 MongoDB
MongoDB 是一个开源、基于文档的 NoSQL 数据库,使用文档导向的数据模型是一个,它以其高性能、高可用性和易扩展性而闻名,非常适合处理大量的分布式数据。它以 BSON(二进制 JSON)格式存储数据,这使得它在存储复杂数据结构时非常灵活。
1.2 特点
- 高性能:MongoDB 提供高性能的数据持久化。
- 高可用性:通过副本集(Replica Sets)实现数据的自动故障转移。
- 易扩展性:通过分片(Sharding)支持水平扩展。
1.3 与关系数据库的区别:
- MongoDB 中存储的文档必须有一个
_id
键。这个键的值可以是任何类型的,默认是个 ObjectId 对象。 - MongoDB 本身不支持传统关系型数据库中的 JOIN 操作,但支持引用,
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 子文档、嵌套 | 表连接,MongoDB 不支持 |
primary key | primary key | 主键,MongoDB 自动将_id 字段设置为主键 |
1.4 资源链接:
- mongoose
- docker
- mongo docker
二:安装 MongoDB
2.1 安装前的准备
这里我使用 docker ,这样方便点,如果没有安装 docker,需要先进行 docker 安装
2.2 安装、启动 MongoDB
# 拉取
docker pull mongo:latest# 运行 , mongodb默认的端口时 27017
docker run -d --name mongo -p 8017:27017 mongo
2.3 创建用户 MongoDB
# 进入容器docker exec -it mongo mongo admin# 创建用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});# 验证
db.auth("root", "123456")
三、连接
使用 Navicat 进行连接测试 , 使用上面设置的用户名、密码
root
,123456
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
四:MongoDB 基础操作
4.1 库操作:
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
// 显示所有数据库
show dbs// 切换数据库use demo
db
// 输出 : demo// 新增 , 插入一条数据,会自动创建这个数据库 和 集合,并插入该条数据
db.demo.insertOne({"name":"demo name"})// 删除库
db.dropDatabase()
4.2 集合操作
db.createCollection("demo");
// 新增 , 插入一条数据,会自动创建这个数据库 和 集合,并插入该条数据
db.demo.insertOne({ name: "demo name" });// 更新集合
db.adminCommand({renameCollection: "test.demo",to: "test.demos",
});
// 删除集合
db.demo.drop();
4.3 文档操作
常用的插入文档方法包括:
db.collection.insertOne()
:插入单个文档db.collection.insertMany()
:插入多个文档db.collection.save()
:类似于 insertOne()。如果文档存在,则该文档会被更新;如果文档不存在,则会插入一个新文档
查询
MongoDB 查询文档使用 find()
、findOne()
方法。
// 查全部
db.myCollection.find({});
// 条件查询
db.myCollection.find({ age: { $gt: 25 } });
编辑
常用的方法包括 updateOne()
、updateMany()
、replaceOne()
和 findOneAndUpdate()
。
// 单条
db.myCollection.updateOne({ name: "jty" }, // 过滤条件{ $set: { age: 26 } } // 更新操作
);
// 多条db.myCollection.updateMany({ age: { $lt: 30 } }, // 过滤条件{ $set: { status: "active" } } // 更新操作
);// 替换db.myCollection.replaceOne({ name: "jty" }, // 过滤条件{ name: "jty", age: 31 } // 新文档
);
删除
常用的删除文档方法包括 deleteOne()
、deleteMany()
以及 findOneAndDelete()
。
db.demo.deleteOne({ name: "jty" });
db.demo.deleteMany({ status: "1" });
db.demo.findOneAndDelete({ name: "Charlie" });
排序
指定要排序的字段及排序顺序。
- 1 表示升序
- -1 表示降序。
// 按 age 字段升序排序
db.myCollection.find().sort({ age: 1 });
文档关联
文档间可以通过嵌入和引用来建立联系。
MongoDB 中的关系可以是:
- 1:1 (1 对 1)
- 1: N (1 对多)
- N: 1 (多对 1)
- N: N (多对多)
引用:
// 假设我们有两个集合:users 和 posts
db.users.insertOne({ _id: 1, name: "jty" });
db.posts.insertOne({ _id: 101, authorId: 1, content: "Hello, MongoDB!" });// 查询用户及其发布的帖子
const user = db.users.findOne({ _id: 1 });
const posts = db.posts.find({ authorId: 1 });// 在应用层合并结果
console.log(user.name,posts.map((post) => post.content)
);
五:Mongoose 使用
先介绍下 mongoose 的一些概念、然后以常见功能开发,来举例实现一些 api 介绍,如子文档嵌套、关联查询、查询密码隐藏、默认值设置、MD5 加密、文档数组更新
5.1 Mongoose 介绍
Mongoose 中的一切都始于
结构(Schema)
,没有模型有一个默认 Id_id
, 他是ObjectId()
类型的
模型(Model)
是从 Schema 定义编译而来的奇特构造函数, 模型的一个实例称为 document。模型负责从底层 MongoDB 数据库创建和读取文档。
5.2 安装
npm install mongoose --save
5.3 引入
const mongoose = require("mongoose");
5.4 建立链接
await mongoose.connect("mongodb://127.0.0.1:27017/test");
// 添加用户认证
await mongoose.connect("mongodb://root:123456@localhost:8017/test?authSource=admin");
5.5 创建模式
const UserSchema = new mongoose.Schema({name: String,
});
5.6 创建模型
const User = mongoose.model("User", UserSchema);
5.7 查询数据库, 查看已什么开头的名字
await User.find();
await User.find({ name: /^fluff/ });
5.8 增删查改
通过对模型的操作,可以完成增删查改
增
// <!-- 构建文档 -->const user = new User({ name: "jty" });
console.log(user.name); // ''
// <!-- 保存进数据库 -->
await user.save();// 或者下面的方式
await User.create({ name: "jty" });
await User.insertMany([{ name: "jty" }]);
删
await User.deleteOne({ name: "jtt" });
查
await User.find({}); // 查询全部
await User.find({ name: /^jty/ }); // 正则查询
await User.findOne({ name: "jty", age: { $gte: 18 } }).exec(); // 条件查询
改
await Tank.updateOne({ name: "jty" }, { name: "jtt" });
await Tank.updateMany({ name: "jty" }, { name: "jtt" });
六:备份 、恢复数据
- 使用
mongodump
工具备份 MongoDB 数据库。 - 使用
mongorestore
工具恢复备份的数据。
七:结语
MongoDB 是一个功能强大的 NoSQL 数据库,适用于各种规模的应用。本文提供了 MongoDB 的基础知识和一些高级特性,帮助你快速上手 MongoDB 和 使用 mongoose 进行 Node 后端开发 , 更多特性建议阅读官方文档,并实践不同的操作和配置。
相关文章:

MongoDB、Mongoose使用教程
文章目录 一:MongoDB 简介1.1 什么是 MongoDB1.2 特点1.3 与关系数据库的区别:1.4 资源链接: 二:安装 MongoDB2.1 安装前的准备2.2 安装、启动 MongoDB2.3 创建用户 MongoDB 三、连接四:MongoDB 基础操作4.1 库操作&am…...
单片机:实现控制步进电机正反转(附带源码)
1. 步进电机概述 步进电机(Step Motor)是一种能够将电能转换为机械能的电动机。其独特之处在于能够精确地控制转动角度,因此被广泛应用于需要精确控制的场合,如打印机、机器人、数控机床、自动化设备等。 步进电机的转动是以“步…...

安装指南|OpenCSG Starship上架GitHub Marketplace
在代码开发的日常中,你是否常常被以下问题困扰? 代码审查耗时太长,拖慢项目进度? 审查质量参差不齐,一些关键问题被遗漏? 复杂代码变更看不懂,审查者需要大量时间理解意图? 别担…...

Excel设置生日自动智能提醒,公式可直接套用!
大家好,我是小鱼。 今天跟大家分享一个WPS表格中根据出生日期,设置生日提醒,并且根据距离生日天数自动标记数据颜色。简单又实用,一个公式轻松搞定! 接下来我们先学习一下需要使用到的函数,然后再根据实例让…...

同步异步日志系统:前置知识
一、日志项目的介绍 1.1 为什么要有日志系统 1、⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题,可以借助日志系统来打印⼀些⽇志帮助开发⼈员解决问题 为什么不直接printf打印在屏幕上呢??因为现实中没有…...
微服务设计原则——功能设计
文章目录 1.ID生成2.数值精度3.DB操作4.性能测试5.版本兼容5.1 向旧兼容5.2 向新兼容 6.异步时序问题7.并发问题7.1 并发时序7.2 并发数据竞争 参考文献 1.ID生成 在分布式系统中,生成全局唯一ID是非常重要的需求,因为需要确保不同节点、服务或实例在并…...

低代码软件搭建自学的第一天——熟悉PyQt
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 学习计划第 1 步:环境搭建1.1 安装 Python1.2 安装 PyQt安装命令:验证安装: 第 2 步:PyQt 基础知识2.1 创建第一个窗…...

基于Python3编写的Golang程序多平台交叉编译自动化脚本
import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…...

远程桌面连接
电脑A:使用机 电脑B:被控制的另一个 方法1: 在电脑B上操作 ①winr输入cmd进入命令行窗口,输入ipconfig查询本机地址 ②我的电脑/此电脑 右键点击“属性” ③选择屏幕右边“远程桌面” ④打开“启用远程桌面” ⑤打开设置&am…...
网络地址转换NAT
NAT(Network Address Translation) 方法于1994年提出。需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球地址IPG。 所有使用本地地址的主机在和外界通信时都要在NAT路由器上将其本地地址转换成外部全球…...

什么是CRM管理软件?CRM的基本概念、功能、选择标准、应用场景
什么是CRM管理软件? 嘿,大家好!今天咱们聊聊一个在现代企业管理中非常重要的工具——CRM管理软件。CRM是Customer Relationship Management(客户关系管理)的缩写,简单来说,它就是一个帮助企业和…...

Python编程常用的19个经典案例
Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…...

【Unity基础】AudioSource 常用方法总结
在 Unity 中,AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play():开始播放音频,如果是从暂停的地方继续播放,可以直接调用。Pause():暂停当前播放的…...
CSS系列(25)-- 滚动优化详解
前端技术探索系列:CSS 滚动优化详解 📜 致读者:探索流畅滚动的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 滚动优化,学习如何创建流畅、高性能的滚动体验。 平滑滚动 🚀 基础设置 /* …...

CST天线设计的六大核心特点:为天线分析提供完整解决方案!
CST Studio Suite 为天线设计提供了从最初的概念评估到最终的合规性测试所需的所有功能,确保天线设计在各种环境下实现稳定通信。这一套工具覆盖了所有重要的设计阶段,帮助设计师顺利完成从概念到成品的全过程。 下面我们来看一看CST电磁仿真中天线设计…...

Ubuntu下C语言操作kafka示例
目录 安装kafka: 安装librdkafka consumer Producer 测试运行 安装kafka: Ubuntu下Kafka安装及使用_ubuntu安装kafka-CSDN博客 安装librdkafka github地址:GitHub - confluentinc/librdkafka: The Apache Kafka C/C library $ apt in…...

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法
怎么将pdf中的某一个提取出来?传统上,我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息,但这种方法往往不够精确,且无法保留原文档的排版和格式。此外,很多时候我们需要提取的内容可能涉及多个页面、多个…...

HTTP接口报错详解与解决 200,500,403,408,404
前言: 仅做学习记录,侵删 背景 当后端编写接口时,经常需要对接口使用ApiFox或者PostMan进行测试,此时就会出现各种各样的报错,一般都会包括报错编码:200,400,401等。这个状态码一般是服务器所返回的包含…...
监控IP频繁登录服务器脚本
该脚本的作用是监控IP登录失败次数,如果某个IP的登录失败次数超过设定的最大次数,则阻止该IP的进一步登录尝试。通过iptables防火墙阻止连接,当一个IP尝试登录次数超过5次时,iptables会阻止来自该IP的所有连接 #!/bin/bashfuncti…...
分布式链路追踪-03-Jaeger、Zipkin、skywalking 中的 span 是如何设计的?
开源项目 auto-log 自动日志输出 Jaeger、Zipkin 中的 spanId 是如何生成的? 在 Jaeger 和 Zipkin 这两个分布式跟踪系统中,Span ID 是通过不同的方法生成的。 下面分别介绍它们的生成方式: Jaeger 中的 Span ID 生成: 在 Ja…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...