📜  MongoDB 中的上限集合

📅  最后修改于: 2022-05-13 01:56:58.254000             🧑  作者: Mango

MongoDB 中的上限集合

上限集合是固定大小的集合,这意味着当我们创建集合时,我们必须固定集合的最大大小(以字节为单位)和它可以存储的最大文档数。创建后,如果我们尝试向其容量添加多个文档,它会覆盖现有文档。它支持高吞吐量操作,这在我们根据插入顺序插入和检索文档时非常有用。封顶集合的工作类似于循环缓冲区,这意味着一旦为封顶集合分配了固定空间,它就会通过覆盖给定集合中最旧的文档来为新文档创建/腾出空间。上限集合也可以有 _id 字段,默认情况下,每个 _id 字段都有一个索引。

如何创建一个上限集合?

我们使用 MongoDB 中的createCollection()方法创建上限集合。当我们创建一个新的有上限的集合时,我们必须以字节为单位指定集合的最大大小,这将被 MongoDB 预先分配给集合。上限集合的大小包含少量的内部开销空间,如果大小字段的值小于或等于 4096,则集合的容量为 4096 字节。否则,MongoDB 将自动增加大小以使其成为 256 的整数倍,并使用 max 字段指定最大文档数。如果给定的集合在达到最大文档数之前达到最大大小限制,则 MongoDB 会删除旧文档以为新文档创建空间。

句法:

参数:



  • 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.student.isCapped()

将学生收藏转换为上限后:



如何将集合转换为上限?

如果存在我们想要将其更改为有上限的现有集合,我们可以使用convertToCapped命令来完成。它将当前集合更改为上限集合:

句法:

例子:

db.runCommand({"convertToCapped":"student",size:5000})

在转换为上限之前:

转换为上限后:

上限集合的优点

  • 要按插入顺序返回文档,查询不需要索引,因为它提供了更大的插入吞吐量。
  • 上限集合允许与原始文档大小匹配的更改,以确保文档不会更改其在磁盘上的位置。
  • 保存日志文件很有用。

限制集合的缺点

  • 如果文档的更新超过集合的原始大小,则更新操作失败。
  • 无法从有上限的集合中删除文档。如果要删除上限集合中的所有记录,请使用给定的命令:
{ emptycapped: Collection_name }
  • 上限集合不能是碎片。