Skip to content

MongoDB - 有上限集合

MongoDB - 固定大小集合(Capped Collections)

Section titled “MongoDB - 固定大小集合(Capped Collections)”

固定大小集合(Capped Collections)是特殊的固定大小集合,其工作方式类似于循环缓冲区。一旦集合填满其分配的空间,它会通过覆盖集合中最旧的文档来为新文档腾出空间。它们针对高吞吐量操作进行了优化,并保持插入顺序。

由于其特性,固定大小集合非常适合存储应用程序日志、缓存会话数据或捕获来自 IoT(物联网)设备的大容量实时数据流等用例。

您使用标准的 db.createCollection 命令,并带上 capped: true 选项,同时以字节为单位指定 size。您还可以选择使用 max 来限制文档数量。

// 创建一个用于日志记录的固定大小集合,大小为 10 兆字节
db.createCollection("activityLog", {
capped: true,
size: 10485760, // 10 * 1024 * 1024 字节
max: 5000 // 可选:最多 5000 个文档
});

MongoDB 将强制执行 size 或 max 限制,以先达到的为准。要检查集合是否为固定大小集合,您可以使用 isCapped() 方法:

> db.activityLog.isCapped()
true

您也可以将现有的标准集合转换为固定大小集合,尽管这不太常见:

// 这会将 'posts' 集合转换为固定大小集合
db.runCommand({
"convertToCapped": "posts",
size: 100000 // 大小,单位为字节
});
  • 插入顺序: 文档按照插入的顺序存储。对固定大小集合的查询默认按此自然顺序返回文档,使其速度极快。
  • 无法删除: 您不能从固定大小集合中删除文档。集合通过覆盖旧文档来管理自身大小。
  • 更新限制: 您可以更新文档,但更新操作不能导致文档大小增加。这会保留文档在磁盘上的原始位置。
  • 不支持分片: 固定大小集合不能进行分片。
  • 索引: 您可以在固定大小集合上创建索引,就像在标准集合上一样。在现代 MongoDB 版本中,_id 字段默认会自动索引。

标准查询按预期工作。要按反向插入顺序检索文档,您可以按 $natural 顺序排序。

// 获取最近 10 条日志条目
db.activityLog.find().sort({ $natural: -1 }).limit(10);

与固定大小集合相关的最强大功能是可尾随游标(tailable cursor)。可尾随游标是一种特殊类型的游标,在客户端耗尽初始结果后仍保持打开状态。当新文档插入到固定大小集合中时,可尾随游标会继续实时地将它们流式传输给客户端。

这使得它们非常适合构建实时数据流或实时监控系统。以下是一个使用 MongoDB 驱动程序的概念性示例(语法因语言而异):

// 在类似 Node.js 的环境中的概念性示例
const cursor = db.collection('activityLog').find({}, {
tailable: true,
awaitData: true, // 与 tailable 结合使用可提高效率
numberOfRetries: -1 // 无限期保持游标打开
});
// 监听新插入的数据
cursor.on('data', (doc) => {
console.log('New log entry:', doc);
});