如何为MongoDB的prices集合设置100条数据上限并自动清理旧数据?
实现MongoDB prices集合最多保留100条数据的方法
方法一:使用固定集合(Capped Collection)
这是MongoDB原生支持的自动维护固定文档数量的方案,会按插入顺序自动淘汰最早的文档,完全匹配你的需求。
- 创建固定集合
打开MongoDB Shell(命令行输入mongosh),执行以下命令创建prices集合:
db.createCollection("prices", { capped: true, size: 1048576, max: 100 })
capped: true:标记为固定集合size:必填参数,设置集合的最大字节容量(这里填1MB=1048576字节,足够容纳100条常规数据)max:指定集合最多保留的文档数,达到100后新增数据会自动删除最早的文档
- 验证配置
执行命令查看集合属性,确认固定集合配置生效:
db.prices.stats()
输出中会显示capped: true,以及你设置的max和size值。
- 正常插入数据
直接执行插入操作即可,无需额外处理,集合会自动维持100条数据的上限:
db.prices.insertOne({ price: 10.5, timestamp: new Date() })
(建议添加timestamp字段,方便直观确认文档的插入顺序)
方法二:手动控制插入逻辑(适合已存在的普通集合)
如果已经创建了普通prices集合,不想改为固定集合,可以在插入时手动检查并清理旧数据:
- 插入+清理脚本
执行以下逻辑,插入新数据后如果总数超过100,删除最早的文档:
// 插入新数据 db.prices.insertOne({ price: 12.3, timestamp: new Date() }) // 计算超出的文档数量,删除最早的一批 const excessCount = db.prices.countDocuments() - 100 if (excessCount > 0) { db.prices.deleteMany({}, { sort: { _id: 1 }, limit: excessCount }) }
- 这里默认用
_id排序(MongoDB的_id包含时间戳,能反映插入顺序),如果你有自定义的时间字段(比如createTime),可以把{ _id: 1 }换成{ createTime: 1 }。
注意事项
- 固定集合创建后无法修改配置,也不能转为普通集合,如需调整参数,只能删除集合后重新创建。
- 手动控制方式需要确保每次插入都执行清理逻辑,灵活性更高,但性能略低于原生固定集合。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

