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

MongoDB集合学习笔记

1. 集合 (Collection) - 数据库里的“文件夹”

您可以把 集合 想象成一个专门存放某种类型文档的“文件夹”。

  • 与关系型数据库(如MySQL)的对比

    • 在MySQL里,我们有表 (Table)
    • 在MongoDB里,我们有集合 (Collection)
  • 核心特点:灵活的结构(无固定结构)
    这是MongoDB最大的特点之一。在一个关系型数据库的“表”里,每一行都必须有完全相同的列。但在MongoDB的“集合”里,每个文档都可以有自己不同的键。

    例子:
    假设我们有一个名为 my_sites 的集合,我们可以往里面放下面这些结构完全不同的文档,而不会报错:

    // 文档1: 只有最基本的信息
    {"site": "www.baidu.com"
    }// 文档2: 多了一个 "name" 键
    {"site": "www.google.com","name": "Google"
    }// 文档3: 不仅多了 "name",还有一个数字类型的 "num"
    {"site": "www.runoob.com","name": "菜鸟教程","num": 5
    }
    

    尽管它们结构不同,但因为都和“网站”相关,所以放在同一个集合里是合理的。

  • 自动创建
    您不需要先创建一个集合再往里面放数据。当您向一个不存在的集合中插入第一个文档时,MongoDB会自动为您创建这个集合。


2. 合法的集合名 - 给“文件夹”起名字的规则

给集合起名字就像给电脑上的文件夹命名一样,需要遵守一些规则:

  1. 不能为空:集合必须有个名字。
  2. 不能包含 \0 (空字符):这是系统内部用来识别名字结尾的特殊字符,我们不能使用。
  3. 不能以 system. 开头:比如 system.userssystem.indexes。这是MongoDB内部自己使用的,为了避免冲突,我们不能用这个前缀来命名自己的集合。
  4. 名字里最好不要有 $:这个符号在MongoDB的查询语言里有特殊含义(比如 $set, $gt 等操作符)。为了避免混淆和潜在的错误,不要在集合名中使用它。

例子:

  • 合法的名字 ✅users, products, user_orders
  • 非法的名字 ❌system.data (以system.开头), my$collection (含有$)

3. Capped Collections (固定大小集合) - 一个“循环写入的日志本”

这是一个非常特殊的集合类型。您可以把它想象成一个大小固定的、写满了就会自动覆盖掉最旧内容的“日志本”。

核心特性:

  • 固定大小 (Fixed Size):在创建时,您必须指定这个集合在硬盘上占多大空间。空间一旦分配,就不会再增长。
  • 高性能写入:因为新数据总是被添加到末尾,不需要复杂的索引计算,所以写入速度非常快。
  • 保留插入顺序:文档会严格按照它们被插入的顺序存储。
  • 先进先出 (FIFO):当集合空间被写满后,如果再有新文档插入,最老的一个文档就会被自动删除,为新文档腾出空间。

最经典的应用场景:日志记录。 比如,系统只需要保存最近24小时的日志。使用固定大小集合,就无需手动去删除旧日志,它会自动覆盖。MongoDB自身的复制操作日志(oplog.rs)就是用的这种集合。

创建和使用限制:

  • 必须显式创建:不能像普通集合那样自动创建。必须使用命令:

    // 创建一个名为 mycoll 的固定大小集合,大小上限为 100000 字节
    db.createCollection("mycoll", {capped: true, size: 100000})
    
  • 更新限制:可以更新文档,但更新后的文档大小不能超过它原始的大小。因为如果变大了,就会挤占后面文档在硬盘上的位置,破坏了其结构。

  • 不能删除单个文档:您不能从一个固定大小集合中删除某一个文档。

  • 只能清空整个集合:要删除数据,只能用 drop() 方法把整个集合连同里面的所有数据一起删除。之后如果还想用,就需要重新创建。


4. 元数据与系统集合 - MongoDB的“内部档案室”

每个数据库都有一些特殊的、以 system. 开头的集合,它们就像是数据库的“内部档案室”,用来存储自身的管理信息,也就是元数据。我们通常只查询它们,而很少去修改。

  • dbname.system.namespaces: 记录了数据库里所有集合和索引的“花名册”。
  • dbname.system.indexes: 存放了所有索引的详细信息。
  • dbname.system.profile: 如果您开启了数据库性能分析(profiling),查询的性能数据就会记录在这里。
  • dbname.system.users: 存储数据库的用户和权限信息。

操作限制总结:

  • 您可以通过在 system.indexes 中插入数据来创建索引
  • 您可以修改 system.users管理用户
  • 您可以删除 system.profile清空性能分析数据
  • 除此之外,应避免直接修改这些系统集合,以免破坏数据库的正常运行。
http://www.dtcms.com/a/391410.html

相关文章:

  • C++ 中 std::list使用详解和实战示例
  • IO流的简单介绍
  • 【AI论文】SAIL-VL2技术报告
  • 基于 SSM(Spring+SpingMVC+Mybatis)+MySQL 实现(Web)软件测试用例在线评判系统
  • 【2/20】理解 JavaScript 框架的作用:Vue 在用户界面中的应用,实现一个动态表单应用
  • Android冷启动和热启动以及温启动都是什么意思
  • Java数据结构 - 单链表的模拟实现
  • git忽略CRLF警告
  • 不用手也能玩手机?多代理协作框架让 APP 自动执行任务
  • 装备制造企业支撑智能制造的全生命周期数据治理实践
  • 【论文阅读 | AAAI 2025 | Mamba YOLO: 基于状态空间模型的目标检测简单基线​​】
  • AdMergeX与小川科技最右App合作案例入选中国信通院“高质量数字化转型典型案例集”
  • LoadBalancer配置
  • 国内外主流开源密码库:演进背景、国密适配与企业维护挑战
  • 车规级MCU在特种车辆车身控制中的应用研究
  • 深度学习基本模块:GRU 门控循环单元
  • 通过Keepalived+LVS搭建NAT模式的高可用集群系统保姆级教程
  • 设备硬件能力调用:传感器、蓝牙与定位
  • 完全二叉树的链式创建以及遍历
  • 数据结构——二叉树和BST(2)
  • 一文解码百度地图ETA
  • 好题推荐-剑指S10
  • Python 中的魔术方法(Magic Methods)
  • JavaScript事件循环机制----event loop
  • C++编程学习(第33天)
  • 伺服上位机展示
  • Class62 优化算法
  • 电气专业科研怎么入门?电气仿真入门秘籍
  • 软考-系统架构设计师 基于构件的软件工程详细讲解
  • MCP 项目标准管理工具 v1.1.0 发布:新增 API 调试功能,助力 AI 辅助开发标准化