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. 合法的集合名 - 给“文件夹”起名字的规则
给集合起名字就像给电脑上的文件夹命名一样,需要遵守一些规则:
- 不能为空:集合必须有个名字。
- 不能包含
\0
(空字符):这是系统内部用来识别名字结尾的特殊字符,我们不能使用。 - 不能以
system.
开头:比如system.users
、system.indexes
。这是MongoDB内部自己使用的,为了避免冲突,我们不能用这个前缀来命名自己的集合。 - 名字里最好不要有
$
:这个符号在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
来清空性能分析数据。 - 除此之外,应避免直接修改这些系统集合,以免破坏数据库的正常运行。