MongoDB固定集合

MongoDB固定集合教程

MongoDB 中,固定集合指的是事先创建,并且大小固定的集合。即假设一个集合设置了固定大小为 100,再添加一条文档的时候,会把最前面的文档剔除,永远只保留 100 条数据。

固定集合特性:固定集合很像环形队列,如果空间不足,最早的文档就会被删除,为新的文档腾出空间。一般来说,固定集合适用于任何想要自动淘汰过期属性的场景。

固定集合应用场景

比如日志文件,聊天记录,通话信息记录等只需保留最近某段时间内的应用场景,都会使用到 MongoDB 的固定集合。

当指定文档数量上限时,必须同时指定大小。淘汰机制只有在容量还没有满时才会依据文档数量来工作。要是容量满了,淘汰机制会依据容量来工作。

固定集合优点

  1. 写入速度提升。固定集合中的数据被顺序写入磁盘上的固定空间,所以,不会因为其他集合的一些随机性的写操作而 “中断”,其写入速度非常快(不建立索引,性能更好)。
  2. 固定集合会自动覆盖掉最老的文档,因此不需要再配置额外的工作来进行旧文档删除。设置 Job 进行旧文档的定时删除容易形成性能的压力毛刺。

注意事项

  1. 固定集合创建之后就不可以改变,只能将其删除重建。
  2. 普通集合可以使用 convertToCapped 转换固定集合,但是固定集合不可以转换为普通集合。
  3. 创建固定集合,为固定集合指定文档数量限制时(指参数 max),必须同时指定固定集合的大小(指参数 size)。不管先达到哪一个限制,之后插入的新文档都会把最老的文档移除集合。
  4. 使用 convertToCapped 命令将普通集合转换固定集合时,既有的索引会丢失,需要手动创建。并且,此转换命令没有限制文档数量的参数(即没有 max 的参数选项)。
  5. 不可以对固定集合进行分片。
  6. 对固定集合中的文档可以进行更新(update)操作,但更新不能导致文档的 Size 增长或缩小,否则更新失败。假如集合中有一个 key,其 value 对应的数据长度为 100 个字节,如果要更新这个 key 对应的 value,更新后的值也必须为 100 个字节,大于 100 个字节不可以,小于 100 个字节也不可以。
  7. 不可以对固定集合执行删除文档操作,但可以删除整个集合。
  8. 还有一定需要注意,对集合估算 size 时,不要依据集合的 storageSize ,而是依据集合的 size。storageSize 是 wiredTiger 存储引擎采用高压缩算法压缩后的。

MongoDB创建固定集合详解

语法

db.createCollection("collection_name",{capped:true, size:1024});

参数

参数 描述
collection_name 集合名

说明

通过设置 capped 为 true 来创建一个固定集合,通过 size 参数,来指定固定集合的大小,这里限制固定集合只能存放 1024 个字节。

MongoDB创建固定集合详解

语法

db.createCollection("collection_name",{capped:true, size:1024, max:100});

参数

参数 描述
collection_name 集合名

说明

通过设置 capped 为 true 来创建一个固定集合,通过 size 参数,来指定固定集合的大小,这里限制固定集合只能存放 1024 个字节。

同时,还可以限制最多只能存放 100 条记录。

案例

我们首先,使用 mongo 命令,连接上数据库,具体命令如下:

mongo

如下图所示:

01_MongoDB固定集合.png

现在,我们使用 use 命令,切换到 haicoder 数据库,具体命令如下:

use haicoder

现在,我们创建一个固定集合,具体命令如下:

db.createCollection("haicoder",{capped:true, size:1024, max:4});

执行完毕后,此时,如下图所示:

02_MongoDB固定集合.png

我们使用 insert 插入记录,具体命令如下:

db.haicoder.insert([ {"url":"haicoder.net/cpp", "course":"cpp"}, {"url":"haicoder.net/golang", "course":"golang"} ])

执行完毕后,此时,如下图所示:

03_MongoDB固定集合.png

现在,我们再次插入两条记录,具体命令如下:

db.haicoder.insert([ {"url":"haicoder.net/java", "course":"java"}, {"url":"haicoder.net/mongodb", "course":"mongodb"} ])

执行完毕后,此时,如下图所示:

04_MongoDB固定集合.png

我们看到,我们再次成功插入了两条记录,现在,我们查看所有的记录,具体命令如下:

db.haicoder.find({}, {_id:0})

执行完毕后,此时,如下图所示:

05_MongoDB固定集合.png

我们再次插入一条记录,具体命令如下:

db.haicoder.insert({"url":"haicoder.net/mysql", "course":"mysql"})

执行完毕后,我们再次查看所有记录,此时,如下图所示:

06_MongoDB固定集合.png

我们看到,最新插入的记录已经被删除了,被后来的记录覆盖了。

MongoDB固定集合总结

在 MongoDB 中,固定集合指的是事先创建,并且大小固定的集合。即假设一个集合设置了固定大小为 100,再添加一条文档的时候,会把最前面的文档剔除,永远只保留 100 条数据。

固定集合特性:固定集合很像环形队列,如果空间不足,最早的文档就会被删除,为新的文档腾出空间。一般来说,固定集合适用于任何想要自动淘汰过期属性的场景。