MongoDB - 有上限集合
MongoDB - 固定大小集合(Capped Collections)
Section titled “MongoDB - 固定大小集合(Capped Collections)”固定大小集合(Capped Collections)是特殊的固定大小集合,其工作方式类似于循环缓冲区。一旦集合填满其分配的空间,它会通过覆盖集合中最旧的文档来为新文档腾出空间。它们针对高吞吐量操作进行了优化,并保持插入顺序。
由于其特性,固定大小集合非常适合存储应用程序日志、缓存会话数据或捕获来自 IoT(物联网)设备的大容量实时数据流等用例。
创建固定大小集合
Section titled “创建固定大小集合”您使用标准的 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 // 大小,单位为字节});主要特性和限制
Section titled “主要特性和限制”- 插入顺序: 文档按照插入的顺序存储。对固定大小集合的查询默认按此自然顺序返回文档,使其速度极快。
- 无法删除: 您不能从固定大小集合中删除文档。集合通过覆盖旧文档来管理自身大小。
- 更新限制: 您可以更新文档,但更新操作不能导致文档大小增加。这会保留文档在磁盘上的原始位置。
- 不支持分片: 固定大小集合不能进行分片。
- 索引: 您可以在固定大小集合上创建索引,就像在标准集合上一样。在现代 MongoDB 版本中,
_id字段默认会自动索引。
查询和可尾随游标
Section titled “查询和可尾随游标”标准查询按预期工作。要按反向插入顺序检索文档,您可以按 $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);});