当前位置: 首页 > news >正文

MongoDB入门详解

文章目录

  • MongoDB
    • 下载和安装
    • 1.MongoDBCompass字段简介
      • 1.1 Aggregations(聚合)
      • 1.2 Schema(模式分析)
      • 1.3 Indexes(索引)
      • 1.4 Validation(数据验证)
    • 2.增删改查操作
      • 2.1创建、删除数据库,集合
      • 2.2创建集合的可选参数
      • 2.3条件操作符
      • 2.4排序
      • 2.5索引
    • 3.操作案例
      • 3.1 覆盖索引查询
      • 3.2 查询分析explain
      • 3.3 原子操作
      • 3.4 高级索引:复合索引 / 文本索引 / 哈希索引
      • 3.5 MapReduce 操作
      • 3.6 全文检索(Text Search)
      • 3.7 正则表达式查询
      • 3.8 自增 ID(模拟方式)
    • 参考文章

MongoDB

下载和安装

mongodb官网:https://www.mongodb.com/

下载MongoDB和MongoDBCompass。

1.MongoDBCompass字段简介

在这里插入图片描述

1.1 Aggregations(聚合)

  • 分组($group
  • 过滤($match
  • 统计(如计数、求和、平均)
  • 排序、投影、连接等操作

类似 SQL 中的 GROUP BY + HAVING + 函数处理。

1.2 Schema(模式分析)

MongoDB 是无模式(schema-less)的数据库,但 Schema 工具可以自动分析当前集合中字段的结构、类型、分布等

  • 每个字段的数据类型(string、number、array 等)
  • 是否为可选字段
  • 是否为空值多
  • 字段的出现频率(字段使用的百分比)

1.3 Indexes(索引)

MongoDB 中的索引类似于关系型数据库中的索引,它能加速查询,避免每次都全表扫描。

常见索引类型:

  • 单字段索引:对某个字段加速,如 name
  • 复合索引:多个字段组合加速,如 { name: 1, age: -1 }
  • 唯一索引:字段值不能重复
  • TTL 索引:自动过期删除文档(常用于缓存/临时数据)

Compass 中作用:

  • 查看当前集合有哪些索引
  • 创建、删除索引
  • 查看哪些索引在使用(查看性能瓶颈)

1.4 Validation(数据验证)

虽然 MongoDB 是无模式的,但你可以通过 Validation 规则对插入的数据进行验证约束

比如你可以要求:

  • 字段 age 必须是数字且 >= 0
  • email 字段必须存在,且是字符串

Compass 中作用:

你可以可视化地配置 Validation,避免后端插入非法数据,让 MongoDB 更“像关系型数据库”。

2.增删改查操作

MongoDB 创建集合 | 菜鸟教程

2.1创建、删除数据库,集合

当你使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它。

如果数据库不存在,则创建数据库,否则切换到指定数据库。

1、创建数据库

在这里插入图片描述

没有这个数据库,是因为还没有数据,所以就不显示这个dbname,可以增加一条数据,就可以显示。

在这里插入图片描述

2、删除数据库(删除当前处于的这个数据库)

在这里插入图片描述

3、创建集合

在这里插入图片描述

4、删除集合

db.name.drop()

2.2创建集合的可选参数

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称。
  • options: 可选参数, 指定有关内存大小及索引的选项。

具体参数详见:MongoDB 创建集合 | 菜鸟教程

采用可视化界面创建Validation规则:

在这里插入图片描述

现在分别插入两个数据一个错误,一个正常观察结果。

在这里插入图片描述

在这里插入图片描述

详细错误:

在这里插入图片描述

可以看到是邮箱验证不正确。

2.3条件操作符

MongoDB 条件操作符 | 菜鸟教程

2.3.1、in操作符

在这里插入图片描述

2.3.2、逻辑操作符

在这里插入图片描述

2.4排序

在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

sort()方法基本语法如下所示:

db.collection.find().sort({ field1: 1, field2: -1 })

  • { field1: 1, field2: -1 }:指定要排序的字段及排序顺序。1 表示升序,-1 表示降序。

2.5索引

MongoDB 索引 | 菜鸟教程

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

在 MongoDB 中,常见的索引类型包括:

  • 单字段索引:基于单个字段的索引。
  • 复合索引:基于多个字段组合的索引。
  • 文本索引:用于支持全文搜索。
  • 地理空间索引:用于地理空间数据的查询。
  • 哈希索引:用于对字段值进行哈希处理的索引。

3.操作案例

3.1 覆盖索引查询

覆盖索引是指查询所需的字段都在一个索引中,MongoDB 无需访问文档本身,从而提升查询效率。

// 插入数据
db.users.insertMany([{ name: "Alice", age: 25, email: "alice@example.com" },{ name: "Bob", age: 30, email: "bob@example.com" }
]);
// 创建索引,仅包含 name 和 age
db.users.createIndex({ name: 1, age: 1 });
// 使用覆盖索引进行查询(不返回 _id)
db.users.find({ name: "Alice" }, { name: 1, age: 1, _id: 0 });

结果预期:

在这里插入图片描述

说明: 查询字段与返回字段全部包含在索引中,命中“覆盖索引”。

3.2 查询分析explain

使用 explain() 方法可查看 MongoDB 查询执行计划,帮助我们理解是否使用了索引。

db.users.find({ age: { $gt: 20 } }).explain("executionStats");

3.3 原子操作

原子性保证单个文档的操作不会中断,如 $inc, $set 等操作。

示例:银行账户转账

// 初始账户
db.accounts.insert({ _id: 1, name: "Tom", balance: 500 });
// Tom 花了 100
db.accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } });
// 查看余额
db.accounts.find({ _id: 1 });

在这里插入图片描述

3.4 高级索引:复合索引 / 文本索引 / 哈希索引

// 复合索引:适用于多条件排序
db.products.createIndex({ category: 1, price: -1 });
// 文本索引:全文搜索
db.articles.insert({ title: "MongoDB", content: "MongoDB" });
db.articles.createIndex({ title: "text", content: "text" });
db.articles.find({ 
$text: { $
search: "indexing" } });
// 哈希索引:用于分片或随机访问
db.users.createIndex({ user_id: "hashed" });

3.5 MapReduce 操作

统计用户总订单金额:

db.orders.insertMany([{ customerId: 1, amount: 100 },{ customerId: 1, amount: 200 },{ customerId: 2, amount: 300 }
]);
db.orders.mapReduce(function () { emit(this.customerId, this.amount); },function (key, values) { return Array.sum(values); },{ out: "total_amount" }
);
// 查询结果
db.total_amount.find();

在这里插入图片描述

3.6 全文检索(Text Search)

db.posts.insertMany([{ title: "MongoDB tutorial", body: "Learn MongoDB full text search." },{ title: "Redis guide", body: "Redis supports fast key-value operations." }
]);
db.posts.createIndex({ title: "text", body: "text" });
db.posts.find({ $text: { $search: "MongoDB search" } });

在这里插入图片描述

3.7 正则表达式查询

db.customers.insertMany([{ name: "Jack" }, { name: "Jason" }, { name: "Linda" }
]);
db.customers.find({ name: /^Ja/ });  // 匹配 "Jack" 和 "Jason"

在这里插入图片描述

3.8 自增 ID(模拟方式)

// 初始化计数器集合
db.counters.insert({ _id: "userid", seq: 0 });
// 获取自增 ID 的函数
function getNextId(name) {return db.counters.findOneAndUpdate({ _id: name },{ $inc: { seq: 1 } },{ returnDocument: "after" }).seq;
}
// 使用自增 ID 插入数据
db.users.insert({ _id: getNextId("userid"), name: "Tom" });

在这里插入图片描述

参考文章

1、https://www.runoob.com/mongodb/mongodb-tutorial.html

相关文章:

  • \documentclass[lettersize,journal]{IEEEtran}什么意思
  • 【计算机视觉】三维重建:tiny-cuda-nn:高性能神经网络推理与训练的CUDA加速库
  • n8n中Wait节点的使用详解:流程暂停与恢复的实战指南
  • K8S node ARP 表爆满 如何优化
  • DeepSeek-Prover-V2:数学定理证明领域的新突破
  • 20、数据可视化:魔镜报表——React 19 图表集成
  • 解决因字段过长使MYSQL数据解析超时导致线上CPU告警问题
  • 浅拷贝和深拷贝的区别
  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • 华为云Astro大屏中桥接器、连接器、转化器以及数据源、数据集、资产管理等概念梳理
  • Leetcode刷题记录30——螺旋矩阵
  • linux-文件操作
  • FreeRTOS菜鸟入门(十一)·信号量·二值、计数、递归以及互斥信号量的区别·优先级翻转以及继承机制详解
  • 基于MATLAB图像中的圆形目标识别和标记
  • MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
  • 2048游戏(含Python源码)
  • 大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置
  • 定位理论第一法则在医疗AI编程中的应用
  • 【PaaS与AI融合】MLOps平台的架构设计
  • 【MCP Node.js SDK 全栈进阶指南】专家篇(1):MCP-SDK扩展与定制
  • 库里22分赢下抢七大战,火箭十年难破“火勇大战”的魔咒
  • 儿童文学作家周晴病逝,享年57岁
  • 人民日报和音:引领新时代中俄关系坚毅前行
  • 工程机械行业景气度持续回升,三大龙头一季度营收、净利双增
  • 上千游客深夜滞留张家界大喊退票?景区:已采取措施限制人流量
  • 人民日报头版头条:青春为中国式现代化挺膺担当