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清空性能分析数据
  • 除此之外,应避免直接修改这些系统集合,以免破坏数据库的正常运行。
相关推荐
木木子99992 小时前
MongoDB文档规范
数据库·mongodb
Python大数据分析2 小时前
mongoDB本地windows安装和初始化
mongodb
Nan_Shu_6143 小时前
学习:uniapp全栈微信小程序vue3后台 (25)
前端·学习·微信小程序·小程序·uni-app
darkb1rd3 小时前
命令注入(Command Injection)漏洞学习笔记
笔记·学习
charlie1145141913 小时前
Chrome 学习小记5——demo:(动态壁纸基础)
chrome·windows·学习
董建光d4 小时前
深度学习笔记:卷积神经网络(CNN)演进与PyTorch构建模型基础
笔记·深度学习·cnn
christine-rr5 小时前
【25软考网工】第五章(10) Internet应用
linux·网络·经验分享·笔记·软考
陈遇巧5 小时前
Spring Framework
java·笔记·spring
weixin_377634845 小时前
【大模型-金融】Trading-R1 多阶段课程学习
学习·金融