【MongoDB篇】MongoDB的集合操作!

在这里插入图片描述

目录

    • 引言
    • 第一节:集合的“诞生”——自动出现还是手动打造?🤔
    • 第二节:集合的“查阅”——看看这个数据库里有哪些柜子?📂👀
    • 第三节:集合的“重命名”——给文件柜换个名字!✏️
    • 第四节:集合的“销毁”——丢掉这个文件柜!💥👋
    • 第五节:集合与模式 (Schema) 的那些事儿 🤔↔️📄
    • 第六节:总结与展望 (集合篇) 🎉📄

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

来,各位csdn的佬友们!💻📱 这是一篇专门为你量身定制的,关于如何“驯服”MongoDB 数据库(而不是里面的数据)的干货文章!请接收!👇

看之前可以先了解一下MongoDB是什么:【MongoDB篇】万字带你初识MongoDB!

引言

各位未来的技术大牛们,你们好!👋 上一篇咱们聊透了 MongoDB 的“房间”——数据库。现在,咱们的目光转向房间里那些用来分门别类存放数据的“文件柜”——集合 (Collection)

了解数据库操作请看:【MongoDB篇】MongoDB的数据库操作!

在传统的关系型数据库里,你把数据放在“表”里,表有固定的列,每行数据都得按照表的结构来。而在 MongoDB 里,这个概念被“集合”取代了。集合是文档 (Document) 的容器,它最大的特点是:同一个集合里的文档,可以有不同的结构! 🤯

想象一下,你的文件柜里不再是整齐划一的文件夹,而是各种形状、大小、内容都不一样的“包裹”(文档),只要你能把它们塞进同一个柜子(集合)里,就行!📦➡️📁

这种灵活的设计,让 MongoDB 在处理多样化、结构不固定的数据时如鱼得水!🚀

那么,对于这些灵活的“文件柜”,我们都能做些什么操作呢?

第一节:集合的“诞生”——自动出现还是手动打造?🤔

就像数据库一样,MongoDB 的集合也可以通过两种方式“诞生”:自动创建 (Implicit Creation)手动创建 (Explicit Creation)

1. 自动创建 (Implicit Creation) - 懒人模式!😴

这是 MongoDB 最常见的方式!当你第一次向一个不存在的集合中插入文档时,MongoDB 会自动创建这个集合。

示例:

假设你当前在 mydatabase 数据库里,并且里面还没有一个叫 users 的集合。

use mydatabase; // 切换到数据库
db.users.insertOne({ name: "张三", age: 30 }); // 向 users 集合插入第一个文档

在这里插入图片描述

执行 db.users.insertOne(...) 命令后,MongoDB 会发现 mydatabase 数据库里还没有 users 这个集合,于是它会自动为你创建 users 集合,然后再把文档插入进去。

此时,如果你执行 show collections; 命令,你会看到 users 集合已经出现在列表里了!🎉

在这里插入图片描述

优点: 开发速度快,特别是在原型开发或数据结构变动频繁时,你不需要停下来先定义集合。
缺点: 无法在创建时指定一些高级选项,比如设置固定大小集合 (Capped Collection) 或添加数据验证规则 (Schema Validation)。

2. 手动创建 (Explicit Creation) - 精心打造模式!📐✨

如果你需要在创建集合时指定一些特殊的属性或行为,比如固定大小、数据验证规则等,你就需要使用 db.createCollection() 命令来手动创建集合。

db.createCollection(name, options)
  • name: 要创建的集合的名称(字符串)。
  • options: 一个文档,用于指定集合的配置选项(可选)。

示例:

db.createCollection("my_logs"); // 创建一个最简单的集合 my_logs// 创建一个带选项的集合
db.createCollection("capped_logs", {capped: true,        // 设置为固定大小集合size: 1024 * 1024 * 100 // 设置集合大小上限为 100MB (字节)
});// 创建一个带数据验证规则的集合
db.createCollection("strict_users", {validator: { // 验证规则$jsonSchema: { // 使用 JSON Schema 标准定义验证规则bsonType: "object", // 文档必须是对象类型required: ["name", "age", "email"], // 必须包含 name, age, email 字段properties: { // 定义字段的规则name: {bsonType: "string",description: "must be a string and is required"},age: {bsonType: "int", // 年龄必须是整数minimum: 0,     // 最小值为 0description: "must be an integer >= 0 and is required"},email: {bsonType: "string",pattern: "^.+@.+\\..+$", // 邮箱格式验证description: "must be a string and match the email pattern and is required"},// 其他可选字段...status: {enum: ["active", "inactive", "pending"], // status 字段的值必须是列表中的一个description: "can only be one of the enum values"}}}},validationLevel: "strict", // 验证级别: "strict" (默认) 或 "moderate"validationAction: "error" // 验证失败时的动作: "error" (默认) 或 "warn"
});

createCollection 命令的常用选项详解:

  • capped: <boolean>:设置为 true 创建一个固定大小集合 (Capped Collection)。固定大小集合有以下特点:
    • 高性能写入:写入速度非常快,因为它只是在集合末尾追加数据。
    • 插入顺序保留:文档始终按照插入顺序存储和读取。
    • 达到上限时自动覆盖:当集合达到 sizemax 指定的上限时,最老的文档会被新的文档自动覆盖,就像一个循环缓冲区!🔄
    • 不支持删除或更新导致的文档大小增加:通常用于存储日志、缓存、消息队列等需要快速写入、按时间排序且会自动清理旧数据的场景。
  • size: <number>:指定固定大小集合的最大容量(以字节为单位)。必须与 capped: true 一起使用。
  • max: <number>:指定固定大小集合的最大文档数量。可选,与 capped: truesize 一起使用。如果同时指定了 sizemax,则哪个先达到,集合就达到上限。
  • validator: <document>:指定集合的数据验证规则 (Schema Validation)。这是一个强大的功能,让你在 MongoDB 的灵活模式基础上,依然能对文档结构和内容进行一定程度的约束!你可以使用 JSON Schema 标准或者 MongoDB 特定的验证表达式来定义规则。
    • 验证规则定义在一个文档中。
    • $jsonSchema 是最推荐的方式,因为它基于标准,易于理解和维护。
    • 你可以定义字段的类型 (bsonType)、必填字段 (required)、字段的属性规则 (properties),甚至更复杂的逻辑。
  • validationLevel: <string>:验证级别,控制验证规则在什么时候执行:
    • strict (默认):对所有的插入和更新操作都应用验证规则。
    • moderate:只对现有的有效文档应用验证规则,对于插入操作和对无效文档的更新才应用验证规则。对于更新操作,如果更新会导致文档从有效变为无效,也会应用验证规则。
  • validationAction: <string>:验证失败时的动作:
    • error (默认):验证失败时,拒绝插入或更新操作,并抛出错误。
    • warn:验证失败时,记录警告日志,但仍然允许插入或更新操作。
  • collation: <document>:指定集合的排序规则 (Collation)。这对于进行字符串比较操作(比如排序、字符串相等比较、范围查询、聚合中的分组等)非常重要,特别是当你处理非英文字符(比如中文)时。可以指定语言、大小写敏感性、重音敏感性等。
  • storageEngine: <document>:指定集合使用的存储引擎的特定选项。通常你不需要在这里指定,除非你有特殊的存储引擎配置需求。MongoDB 默认使用 WiredTiger 存储引擎。

通过 createCollection 命令并配合这些选项,你可以根据不同的业务场景,创建出满足特定需求的“文件柜”!🎯

注意: 手动创建的空集合也会立即出现在 show collections; 列表中!不像自动创建那样需要先有数据。

第二节:集合的“查阅”——看看这个数据库里有哪些柜子?📂👀

想知道你当前所在的数据库里有哪些集合?很简单!

使用 show collections; 命令。

use mydatabase; // 切换到数据库
show collections;

执行这个命令后,你会看到当前数据库中所有集合的名称列表。

注意: 这个命令只会列出当前数据库中的集合,不会列出其他数据库的集合。它就像是打开了当前房间的门,看看里面有哪些文件柜,而不会去隔壁房间看。🚪👀

第三节:集合的“重命名”——给文件柜换个名字!✏️

文件柜名字起得不好?想换个更贴切的名字?没问题!你可以重命名一个集合。

使用 db.collection_name.renameCollection("new_name") 命令。

use mydatabase; // 切换到集合所在的数据库
db.myoldcollection.renameCollection("mynewcollection"); // 将 myoldcollection 改名为 mynewcollection
  • db.myoldcollection: 指定要重命名的集合对象。
  • renameCollection("mynewcollection"): 调用 renameCollection 方法,并传入新的集合名称。

注意: 重命名操作是原子性的,它会一次性完成。重命名后,原集合名称就不能再使用了。

第四节:集合的“销毁”——丢掉这个文件柜!💥👋

如果某个集合的数据已经不再需要,或者整个文件柜都要扔掉,你可以删除(销毁)一个集合。

警告: 删除集合是一个非常危险的操作! 一旦删除,该集合中的所有文档都将永久丢失不可恢复! 在执行这个操作之前,请务必再三确认,并在生产环境谨慎至极,最好先进行备份!💣💾

删除集合的命令是 db.collection_name.drop()

  1. 首先,你需要切换到包含要删除集合的数据库。

  2. 然后,指定要删除的集合名称,并调用 drop() 方法。

    use mydatabase; // 切换到数据库
    db.mycollection.drop(); // 删除名为 mycollection 的集合
    

执行这个命令后,MongoDB 会返回一个结果,告诉你操作是否成功。通常你会看到 true 或者一个包含成功信息的文档。

再运行 show collections;,你会发现刚才删除的集合已经不见了!💨

在这里插入图片描述

重要注意事项:

  • drop() 方法总是删除你调用它的那个集合对象。确保你调用的是正确的集合!
  • 删除集合的操作也需要足够的权限,通常需要该集合所在数据库的 dropCollectiondbAdmin 等角色权限。

第五节:集合与模式 (Schema) 的那些事儿 🤔↔️📄

前面我们一直强调,MongoDB 的集合是“模式灵活”的,同一个集合里的文档可以有不同的结构。这是它与关系型数据库“表”的最大区别之一。

这种灵活性带来了巨大的开发便利性,特别是在数据结构不稳定或多样化的场景。但同时,它也带来了一些挑战:

  • Schema on Read vs Schema on Write: 传统关系型数据库是“Schema on Write”,你在写入数据前就定义好模式,写入时强制遵守。MongoDB 则是“Schema on Read”,它不强制写入时的模式(除非你使用了验证规则),而是在读取数据时由应用程序去理解和处理不同的文档结构。这意味着你的应用程序代码需要更灵活地处理可能存在的字段缺失或类型不匹配问题。
  • 数据一致性: 如果没有验证规则,同一个字段在不同文档中可能有不同的数据类型(比如,某个文档的 age 是数字,另一个是字符串),这可能导致查询或聚合操作出现意外结果。

这就是为什么 MongoDB 引入了数据验证 (Schema Validation) 这个功能!通过在集合层面定义验证规则,你可以在享受模式灵活带来的便利的同时,也能保证关键数据的结构和类型符合预期,提高数据质量和一致性!✅

选择是否使用以及使用多严格的验证规则,取决于你的业务需求和对数据一致性的要求。

第六节:总结与展望 (集合篇) 🎉📄

太棒了!关于 MongoDB 的“文件柜”——集合,我们已经从它的“出生”聊到了“死亡”,还深入了解了它灵活的模式以及如何通过验证规则进行约束!

核心要点回顾:

  • 集合是文档的容器,模式灵活。
  • 创建可以是自动(第一次写入数据时)或手动createCollection)。
  • createCollection 可以指定固定大小 (capped)数据验证 (validator)排序规则 (collation) 等选项。
  • 查看集合使用 show collections;
  • 重命名集合使用 db.collection.renameCollection();
  • 删除集合使用 db.collection.drop();危险!
  • 集合的模式灵活带来便利和挑战,数据验证是平衡两者的方式。

现在,我们已经掌握了如何在 MongoDB 这个“仓库”中划分“房间”(数据库),以及如何在房间里设置“文件柜”(集合)。接下来,就该看看文件柜里那些最最核心的“文件”——文档 (Document) 了!那可是真正的数据载体!📄

关注作者不迷路,下篇文章会讲解。


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

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

相关文章

Goland终端PowerShell命令失效

Goland终端Terminal的PowerShell不能使用&#xff0c;明明windows上升级了PowerShell 7设置了配置文件&#xff0c;但是只能在windows终端下使用&#xff0c;goland终端下直接失效报错&#xff0c;安装升级PowerShell请看Windows11终端升级PowerShell7 - HashFlag - 博客园 问…

简单分析自动驾驶发展现状与挑战

一、技术进展与市场渗透 技术分级与渗透率 当前量产乘用车的自动驾驶等级以L2为主&#xff08;渗透率约51%&#xff09;&#xff0c;L3级处于初步落地阶段&#xff08;渗透率约20%&#xff09;&#xff0c;而L4级仍处于测试和示范运营阶段&#xff08;渗透率约11%&#xff09;2…

【C++类和数据抽象】消息处理示例(1):从设计模式到实战应用

目录 一、数据抽象概述 二、消息处理的核心概念 2.1 什么是消息处理&#xff1f; 2.2 消息处理的核心目标 三、基于设计模式的消息处理实现 3.1 观察者模式&#xff08;Observer Pattern&#xff09; 3.2 命令模式&#xff08;Command Pattern&#xff09; 四、实战场景…

【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】

Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本&#xff0c;并在每个&#xff08;重新&#xff09;样本上重新调整模型&#xff0c;以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 &#xff1a; 用于估计测试误…

常见的 CSS 知识点整理

1. 盒模型&#xff08;Box Model&#xff09;是什么&#xff1f;标准盒模型和 IE 盒模型的区别&#xff1f; 答案&#xff1a; CSS 盒模型将元素视为一个盒子&#xff0c;由内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;bor…

Educational Codeforces Round 178 div2(题解ABCDE)

A. Three Decks #1.由于最后三个数会相等&#xff0c;提前算出来和&#xff0c;%3判断&#xff0c;再判前两个数是否大于 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #…

如何创建一个导入模板?全流程图文解析

先去找到系统内可以上传东西的按钮 把你的模板上传上去,找到对应的fileName 图里的文字写错了,是复制粘贴"filePath"到URL才能下载

通信原理第七版与第六版区别附pdf

介绍 我用夸克网盘分享了「通信原理 第7版》樊昌信」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/be7c5af4cdce 《通信原理&#xff08;第7版&#xff09;》是在第6版的基础上&#xff0c;为了适应当前通信技术发展和教学需求&#xff0c;并吸取了数十所院校教师的反…

Mysql唯一性约束

唯一性约束&#xff08;Unique Constraint&#xff09;是数据库设计中用于保证表中某一列或多列组合的值具有唯一性的一种规则。它可以防止在指定列中插入重复的数据&#xff0c;有助于维护数据的完整性和准确性。下面从几个方面为你详细解释 作用 确保数据准确性&#xff1a…

测试基础笔记第十六天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、UI自动化介绍1.认识UI自动化测试2.实施UI自动化测试前置条件3.UI自动化测试执行时机4.UI自动化测试核心作用和劣势 二、认识Web自动化测试工具-Selenium021.Sel…

PaddleX的安装

参考&#xff1a;安装PaddlePaddle - PaddleX 文档 1、安装PaddlePaddle 查看 docker 版本 docker --version 若您通过 Docker 安装&#xff0c;请参考下述命令&#xff0c;使用飞桨框架官方 Docker 镜像&#xff0c;创建一个名为 paddlex 的容器&#xff0c;并将当前工作目…

长效住宅IP是什么?如何获取长效住宅IP?

在当今的互联网世界里&#xff0c;IP地址作为连接用户与网站之间的桥梁&#xff0c;其重要性不言而喻。对于跨境电商、社交媒体运营以及数据采集等领域的专业人士而言&#xff0c;普通的IP地址已无法满足日益复杂的需求。他们更需要一种稳定、安全且持久的长效住宅IP来完成各类…

02 业务流程架构

业务流程架构提供了自上而下的组织鸟瞰图&#xff0c;是业务流程的全景图。根据所采用的方法不同&#xff0c;有时被称为流程全景图或高层级流程图&#xff0c;提供了业务运营中所有业务流程的整体视图。 这样有助于理解企业内部各个业务流程之间的相互关系以及它们如何共同工…

jenkins slave节点打包报错Failed to create a temp file on

jenkins slave节点打包报错 一、报错信息 FATAL: Unable to produce a script file Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to slave-83at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1784)at hudson.remoting.UserRequest$…

什么是 Swagger 以及如何在 Spring Boot 中实现 Swagger:配置与实践指南

在现代 RESTful API 开发中&#xff0c;Swagger 是一种广泛使用的工具&#xff0c;用于生成、描述和可视化 API 文档。它极大地简化了 API 的开发、测试和维护过程。结合 Spring Boot&#xff0c;Swagger 可以快速集成到项目中&#xff0c;生成交互式 API 文档&#xff0c;方便…

Xilinx FPGA支持的FLASH型号汇总

以博主这些年的FPGA开发使用经验来看&#xff0c;FPGA开发的主流还是以Xilinx FPGA为主&#xff0c;贸易战关税战打了这么多年&#xff0c;我们做研发的也不可避免的要涉及一些国产替代的工作&#xff1b;这里把Xilinx FPGA官方支持的各类&#xff08;国产和非国产&#xff09;…

第3讲:ggplot2完美入门与美化细节打磨——从基础绘制到专业级润色

目录 1. 为什么选择ggplot2? 2. 快速了解ggplot2绘图核心逻辑 3. 基础绘图示范:柱状图、折线图、散点图 (1)简单柱状图 (2)折线图示范 (3)高级散点图 + 拟合线 4. 精细美化:细节打磨决定专业感 5. 推荐的美化小插件(可选进阶) 6. 小练习:快速上手一幅美化…

Vue3 上传后的文件智能预览(实战体会)

目录 前言1. Demo12. Demo2 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器&#xff0c;无代码爬取&#xff0c;就来&#xff1a;bright.cn 此处的基本知识涉及较少&#xff0c;主要以Demo的形式供大…

transformer-实现单层Decoder 层

Decoder Layer 论文地址 https://arxiv.org/pdf/1706.03762 解码器层结构 Transformer解码器层由三种核心组件构成&#xff1a; Masked多头自注意力&#xff1a;关注解码器序列当前位置之前的上下文&#xff08;因果掩码&#xff09; Encoder-Decoder多头注意力&#xff1a;关…

设计模式每日硬核训练 Day 16:责任链模式(Chain of Responsibility Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 15&#xff1a;享元模式小结 在 Day 15 中&#xff0c;我们学习了享元模式&#xff08;Flyweight Pattern&#xff09;&#xff1a; 通过共享对象&#xff0c;分离内部状态与外部状态&#xff0c;大量减少内存开销。适用于字符渲染、游戏场景、图标缓…