【MongoDB】固定集合(Capped Collections)

固定集合是一种特殊类型的MongoDB集合,具有固定大小且自动覆盖最旧文档的特性,适用于高吞吐量的日志记录场景。本文详细介绍固定集合的工作原理、特性、限制及操作步骤。

本章内容:

  • 概述
  • 特性
  • 限制和建议
  • 使用步骤

一、概述

固定集合是大小固定的集合,它们支持高吞吐量操作,这些操作根据插入文档和按照插入顺序检索(retrieve)文档。固定集合的工作方式类似于循环缓存:一旦集合的分配空间占满了,它就会通过覆盖集合中最旧的文档为新文档腾出空间。

有关创建固定集合的更多信息,请参见createCollection()create

提示

作为固定集合的替代方案,可以考虑MongoDB  TTL(Time To Live生存时间)索引。如通过设置TTL使集合中数据过期中所述,TTL索引可以基于日期类型字段的值和索引的TTL值使正常集合中的数据过期并删除。

TTL索引与固定集合不兼容。

 

二、特性

 

1. 插入顺序

固定集合确保对数据插入顺序进行维护。因此,无需索引查询即可按插入顺序返回文档。由于没有这种索引开销,则有固定集合可以支持更高的插入吞吐量。

 

2. 自动删除最文档

为了给新文档腾出空间,固定集合会自动删除集合中最早的文档,而无需脚本或显式删除操作。

以下是可能使用固定集合的场景:

  • 存储大容量系统生成的日志信息。在没有索引的情况下将文件插入固定集合中,将插入日志信息速度接近于直接写入文件系统的速度。此外,内置的先进先出属性可在管理存储空间的同时维护插入事件的顺序。
  • 在固定集合中缓存少量数据。由于缓存数据大量读取操作而非写操作,因此要么确保此集合始终保留在工作集中(即在RAM中),要么对所需的一个或多个索引进行写惩罚。

例如,存储操作日志的副本集oplog.rs集合就是使用固定集合。从MongoDB 4.0开始,不同于其他固定集合,操作日志可以超出其配置的大小限制,以避免删除多数提交点

 

3. _id索引

固定集合默认具有_id字段和_id字段上的索引。

 

三、限制和建议

 

1.  更新文档

如果要更新固定集合中的文档,最好先创建索引,这样更新操作就不会执行集合扫描。

 

2. 文档大小

在版本3.2中更改。

如果更新或替换操作更改了文档大小,则该操作将失败。

 

3. 文档删除

无法从固定集合中删除文档。

要删除集合中的所有文档,使用drop()方法删除集合并重新创建固定集合。

 

4. 分片

固定集合无法分片。

 

5. 查询效率

使用自然顺序可以有效地从集合中检索最近插入的元素。这(有点)类似于日志文件上的tail。

 

6. 聚合$ out

聚合管道 $ out结果不能写入固定集合。

 

7. 事务

从MongoDB 4.2开始,在事务中不能写入固定集合。在事务中支持从固定集合中读取。

 

四、操作步骤

 

1. 创建固定集合

只能使用db.createCollection()方法显式创建固定集合,该方法是mongo shell中create命令的帮助器。

创建固定集合时,必须指定集合大小的上限(以字节为单位),MongoDB将为该集合预先分配指定上限大小的空间。固定集合的大小包括少量内部开销空间。

db.createCollection( "log", { capped: true, size: 100000 } )

如果size字段小于或等于4096,则集合的上限为4096字节。否则,MongoDB将提高提供size的大小,使其成为256的整数倍。

此外,还可以使用max字段为集合指定最大文档数,如以下文档所示:

db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )

重要

即使指定最大文档数,也始终需要size参数。如果集合在达到最大文档数之前达到最大size限制,MongoDB将删除较早的文档。

参考资料:db.createCollection()create

 

2.查询固定集合

如果在不指定任何顺序的固定集合上执行find(),则MongoDB保证查询出结果的顺序与插入顺序相同。

要与插入顺序的相反顺序来检索文档,执行find()同时执行sort()方法,并将sort的$natural参数设置为-1,如以下示例所示:

db.cappedCollection.find().sort( { $natural: -1 } )

 

3.检查集合是否是固定集合

使用isCapped()方法来判断集合是否是固定集合,如下所示:

db.collection.isCapped()

 

4.将集合转换为固定集合

convertToCapped命令可将非固定集合转换为固定集合:

db.runCommand({"convertToCapped": "mycoll", size: 100000});

size参数以字节为单位,指定固定集合的大小。

在转换操作期间,它将持有数据库排他锁。被锁定的数据库的其他操作将被阻止,直到该操作完成。

对于锁定数据库的操作,请参阅一些常见的客户端操作采取了哪些锁?

 

5.tailable游标

可以将tailable游标(尾游标)与固定集合一起使用。与Unix tail -f命令类似,tailable游标“尾随”在固定集合的末尾。

将新文档插入固定集合后,可使用可尾游标继续检索文档。

有关创建可尾光标的信息,请参见游标

关于尾游标:MongoDB Tailable Cursors深入剖析

英文原文参考:capped-collections

<think>好的,用户想学习如何在MongoDB中创建集合。首先,我需要整理MongoDB中创建集合的两种主要方法:自动创建和手动使用`db.createCollection()`命令。根据提供的引用内容,引用[1]提到插入文档时会自动创建集合,而引用[3]和引用[4]则展示了手动创建的方式。需要明确这两种方法的区别和使用场景。 接下来,要确保步骤清晰。自动创建非常简单,用户只需插入文档即可,如引用[1]中的示例`db.mycol2.insert({"name" : "菜鸟教程"})`。手动创建则允许更多的配置选项,比如设置集合的大小、是否固定等,这在引用[3]和引用[4]中都有提到,例如`db.createCollection("liulianjiangcsdn")`和带有参数的创建方式。 还需要注意用户可能遇到的常见问题,比如集合命名规则、何时选择手动创建等。例如,当需要特定配置如固定集合capped)时,必须手动创建。同时,要提醒用户使用`show collections`来验证集合是否创建成功,这在引用[1]和引用[3]中都有示例。 然后,根据用户的要求生成相关问题。问题应涵盖创建方法、配置选项、应用场景以及常见错误,这样用户能进一步深入学习。需要确保问题与引用内容相关,比如引用[4]提到的参数配置,可以生成关于参数的问题。 最后,检查回答是否符合格式要求,如使用正确的LaTeX格式,避免使用Markdown,结构清晰,分步骤说明,并正确添加引用标识。确保没有遗漏任何关键点,并且引用来源准确对应。</think>### MongoDB 创建集合教程 在MongoDB中,创建集合主要有两种方式:**自动隐式创建**和**手动显式创建**。以下为具体方法及步骤: --- #### 1. 自动隐式创建集合 当向一个**不存在的集合**插入文档时,MongoDB会自动创建该集合。 **操作示例**: ```javascript > use test // 切换到test数据库 > db.my_new_collection.insert({name: "示例数据", value: 100}) // 插入文档时自动创建集合 ``` 插入成功后可通过 `show collections` 验证集合是否存在[^1][^3]。 --- #### 2. 手动显式创建集合 使用 `db.createCollection(name, options)` 命令可自定义集合属性,适用于需要特殊配置的场景。 **语法参数**: - `name`: 集合名称 - `options`(可选): 包含配置项的对象,如: - `capped`: 是否创建固定集合固定大小,数据覆盖写入)[^4] - `size`: 固定集合的存储上限(单位:字节) - `max`: 固定集合允许的最大文档数 **操作示例**: ```javascript > db.createCollection("logs", { capped: true, size: 1048576 }) // 创建1MB大小的固定集合 > db.createCollection("users") // 创建普通集合 ``` 创建后可通过 `db.getCollectionInfos({name: "logs"})` 查看集合详细信息[^3]。 --- #### 关键区别与使用场景 | 方法 | 适用场景 | 特点 | |--------------|--------------------------------------|--------------------------| | 自动隐式创建 | 快速插入数据,无需特殊配置 | 简单但无法设置集合属性 | | 手动显式创建 | 需要固定大小、索引优化等高级配置时 | 灵活性高,可定制参数 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值