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清空性能分析数据
  • 除此之外,应避免直接修改这些系统集合,以免破坏数据库的正常运行。
相关推荐
andwhataboutit?1 天前
Docker Compose学习
学习·docker·容器
郭庆汝1 天前
自然语言处理笔记
笔记·自然语言处理·easyui
二进制怪兽1 天前
[笔记] 驱动开发:Virtual-Display-Driver编译过程
笔记
ouliten1 天前
cuda编程笔记(28)-- cudaMemcpyPeer 与 P2P 访问机制
笔记·cuda
im_AMBER1 天前
数据结构 04 栈和队列
数据结构·笔记·学习
咖啡Beans1 天前
SpringBoot集成MongoDB使用
spring boot·mongodb
尘似鹤1 天前
微信小程序学习(六)--多媒体操作
学习·微信小程序·小程序
要做朋鱼燕1 天前
密码学安全:CIA三元组与三大核心技术
网络·笔记·密码学·嵌入式·加密·aes
UpYoung!1 天前
无广技术贴!【PDF编辑器】Solid Converter PDF保姆级图文下载安装指南——实用推荐之PDF编辑软件
学习·数学建模·pdf·编辑器·运维开发·个人开发
金水谣1 天前
考研10.5笔记
笔记