Skip to content

MongoDB 固定集合

在 MongoDB 中,固定集合(Capped Collection)是一种特殊类型的集合,它具有固定的大小和循环写入的特性。固定集合可以用来存储日志数据、事件数据等需要按时间顺序存储和读取的数据。

基本概念

固定集合的工作原理

固定集合的大小是固定的,当集合的大小达到最大值时,MongoDB 会自动删除最早的文档,以便为新文档腾出空间。固定集合的写入操作是循环的,因此它适合存储需要按时间顺序存储和读取的数据。

固定集合的特点

  1. 固定大小:固定集合的大小是固定的。
  2. 循环写入:当集合的大小达到最大值时,MongoDB 会自动删除最早的文档。
  3. 顺序读取:固定集合的文档是按插入顺序存储的,因此读取操作是顺序的。
  4. 高性能:固定集合的写入和读取操作都是高性能的,因为它们不需要维护索引。

创建固定集合

基本语法

javascript
// 创建固定集合
db.createCollection("mycappedcollection", {
  capped: true,
  size: 1000000, // 集合的大小(字节)
  max: 1000 // 集合的最大文档数量
})

示例

javascript
// 创建一个大小为 1MB、最大文档数量为 1000 的固定集合
db.createCollection("logs", {
  capped: true,
  size: 1024 * 1024,
  max: 1000
})

查询固定集合

查询所有文档

javascript
// 查询所有文档
db.logs.find()

查询最后插入的文档

javascript
// 查询最后插入的 10 个文档
db.logs.find().sort({ $natural: -1 }).limit(10)

查询最早插入的文档

javascript
// 查询最早插入的 10 个文档
db.logs.find().sort({ $natural: 1 }).limit(10)

修改固定集合

修改文档

javascript
// 修改文档
db.logs.updateOne(
  { _id: ObjectId("5e8f8f8f8f8f8f8f8f8f8f8f") },
  { $set: { level: "error" } }
)

删除文档

javascript
// 删除文档
db.logs.deleteOne({ _id: ObjectId("5e8f8f8f8f8f8f8f8f8f8f8f") })

固定集合的最佳实践

选择合适的大小

我们应该根据数据的大小和保留时间来选择合适的固定集合大小。如果固定集合的大小太小,数据会很快被覆盖;如果固定集合的大小太大,会浪费存储空间。

避免频繁查询

我们应该避免频繁查询固定集合,因为查询操作会影响写入操作的性能。

定期清理

我们可以定期清理固定集合中的过期数据,以确保固定集合的大小不会超过限制。

总结

在 MongoDB 中,固定集合是一种特殊类型的集合,它具有固定的大小和循环写入的特性。固定集合适合存储需要按时间顺序存储和读取的数据,如日志数据、事件数据等。固定集合的写入和读取操作都是高性能的,因为它们不需要维护索引。在使用固定集合时,我们应该选择合适的大小、避免频繁查询和定期清理,以确保固定集合的高效运行。