MongoDB集合学习笔记

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

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

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

    • 在MySQL里,我们有表 (Table)
    • 在MongoDB里,我们有集合 (Collection)
  • 核心特点:灵活的结构(无固定结构)

    这是MongoDB最大的特点之一。在一个关系型数据库的"表"里,每一行都必须有完全相同的列。但在MongoDB的"集合"里,每个文档都可以有自己不同的键。

    例子:

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

    json 复制代码
    // 文档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)就是用的这种集合。

创建和使用限制:

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

    javascript 复制代码
    // 创建一个名为 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清空性能分析数据
  • 除此之外,应避免直接修改这些系统集合,以免破坏数据库的正常运行。
相关推荐
卡提西亚4 分钟前
C++笔记-21-运算符重载
c++·笔记
学习_学习_再学习11 分钟前
ffmpeg学习记录
学习·ffmpeg
草莓熊Lotso20 分钟前
C++ 继承特殊场景解析:友元、静态成员与菱形继承的底层逻辑
服务器·开发语言·c++·人工智能·经验分享·笔记·1024程序员节
yuxb7338 分钟前
Zabbix企业级分布式监控系统(下)
笔记·zabbix
im_AMBER40 分钟前
算法笔记 10
笔记·学习·算法·leetcode
9ilk1 小时前
【基于one-loop-per-thread的高并发服务器】--- 前置技术
运维·服务器·c++·笔记·后端·中间件
qzhqbb3 小时前
神经网络—— 学习与感知器
神经网络·学习
charlie1145141917 小时前
CSS笔记4:CSS:列表、边框、表格、背景、鼠标与常用长度单位
css·笔记·学习·css3·教程
tjsoft7 小时前
汇通家具管理软件 1.0 试用笔记
笔记
卡提西亚8 小时前
C++笔记-10-循环语句
c++·笔记·算法