MongoDB 中的上限集合
上限集合是固定大小的集合,这意味着当我们创建集合时,我们必须固定集合的最大大小(以字节为单位)和它可以存储的最大文档数。创建后,如果我们尝试向其容量添加多个文档,它会覆盖现有文档。它支持高吞吐量操作,这在我们根据插入顺序插入和检索文档时非常有用。封顶集合的工作类似于循环缓冲区,这意味着一旦为封顶集合分配了固定空间,它就会通过覆盖给定集合中最旧的文档来为新文档创建/腾出空间。上限集合也可以有 _id 字段,默认情况下,每个 _id 字段都有一个索引。
如何创建一个上限集合?
我们使用 MongoDB 中的createCollection()方法创建上限集合。当我们创建一个新的有上限的集合时,我们必须以字节为单位指定集合的最大大小,这将被 MongoDB 预先分配给集合。上限集合的大小包含少量的内部开销空间,如果大小字段的值小于或等于 4096,则集合的容量为 4096 字节。否则,MongoDB 将自动增加大小以使其成为 256 的整数倍,并使用 max 字段指定最大文档数。如果给定的集合在达到最大文档数之前达到最大大小限制,则 MongoDB 会删除旧文档以为新文档创建空间。
句法:
db.createCollection(
参数:
- name:代表集合的名称,为字符串类型。
- options:它是一个可选参数。
可选参数:
- 被封顶:它用于创建一个被封顶的集合。如果此字段的值为真,则您必须在大小字段中指定最大大小。它是布尔类型的。
- autoIndexId:如果此字段的值为 false,则禁用在 _id 字段上自动创建索引。它是布尔类型的。
- size:以字节为单位指定集合的最大大小。它是数字类型。
- max:它指定了上限集合中允许的最大文档数。它是数字类型。
- storageEngine:仅适用于 WiredTiger 存储引擎。它属于文档类型。
- 验证器:它指定集合的验证规则。它属于文档类型。
- 验证级别:它说明了 MongoDB 在更新期间对现有文档应用验证规则的严格程度。它是刺类型的。
- validationAction:它说明是在无效文档上出错还是只是警告违规但允许插入无效文档。它是字符串类型。
- indexOptionDefaults:它允许用户在创建集合时指定索引的默认配置。它是文档类型的。
- viewOn:从中创建视图的源集合或视图的名称。它是字符串类型。
- 管道:它是一个包含聚合管道阶段的数组。或者使用这个 范围 我们可以将管道应用于视图或 viewOne 集合。它是数组类型。
- 排序规则:它指定给定集合中的默认排序规则。它属于文档类型。
- writeConcern:它表示操作的写关注。如果您想使用默认写关注,则避免使用此参数。它是文档类型的。
例子:
在以下示例中,我们正在使用“gfg”数据库,在该数据库中,我们使用 createCollection() 方法创建名为“student”的新上限集合,最大文档容量为“4”。
db.createCollection("student", {capped:true, size:10000, max:4})
现在我们在学生集合中插入文档:
插入文档后,我们将使用 find() 方法显示学生集合中存在的所有文档。
现在,如果我们尝试再插入一个文档,它将覆盖现有文档。在示例中,我们插入了一个名为 Akash 的新文档,该文档覆盖了名为 Mihir 的现有文档:
插入一个或多个文档后:
如何检查集合是否有上限?
我们可以使用 MongoDB 中的 isCapped() 方法检查集合是否有上限。此方法返回 true 是指定的集合上限集合。否则,返回,false。
句法:
db.Collection_name.isCapped()
例子:
db.student.isCapped()
将学生收藏转换为上限后:
如何将集合转换为上限?
如果存在我们想要将其更改为有上限的现有集合,我们可以使用convertToCapped命令来完成。它将当前集合更改为上限集合:
句法:
{
convertToCapped:
size:
writeConcern:
comment:
}
例子:
db.runCommand({"convertToCapped":"student",size:5000})
在转换为上限之前:
转换为上限后:
上限集合的优点
- 要按插入顺序返回文档,查询不需要索引,因为它提供了更大的插入吞吐量。
- 上限集合允许与原始文档大小匹配的更改,以确保文档不会更改其在磁盘上的位置。
- 保存日志文件很有用。
限制集合的缺点
- 如果文档的更新超过集合的原始大小,则更新操作失败。
- 无法从有上限的集合中删除文档。如果要删除上限集合中的所有记录,请使用给定的命令:
{ emptycapped: Collection_name }
- 上限集合不能是碎片。