假设我有一个mongo集合("ResultData").我希望每个月发生集合轮换(similar to log rotation or archiving),并自动将旧集合重命名为"{{old_Collection_name}}_{{Month_Year}}".
这将帮助我在不增加集合大小的情况下保留所有数据.
注:我正在使用Golang进行开发.
假设我有一个mongo集合("ResultData").我希望每个月发生集合轮换(similar to log rotation or archiving),并自动将旧集合重命名为"{{old_Collection_name}}_{{Month_Year}}".
这将帮助我在不增加集合大小的情况下保留所有数据.
注:我正在使用Golang进行开发.
在MongoDB中,集合在使用之前不需要存在:您可以将其插入到尚不存在的集合中,它将被自动创建.
因此,一个简单而自动的解决方案是始终使用其名称是使用当前月份生成的集合.因此,一旦新的月份开始(按月份命名),文档将被插入到新集合中.
下面是一个实现此逻辑的简单帮助器:
func getResultColl(db *mongo.Database) *mongo.Collection {
name := "resultData_" + time.Now().Format("01_2006")
return db.Collection(name)
}
本月(2022年11月),此函数返回名称为resultData_11_2022
的集合.在下个月,返回的集合的名称将是resultData_12_2022
.
使用它:
var db *mongo.Database // initialize your Mongo DB
c := getResultColl(db)
if _, err := c.InsertOne(ctx, resultData); err != nil {
// Handle error
}
提示:如果您将年份移到月份之前,则集合的字母顺序将与时间顺序相同.所以我建议用"2006_01"
格式(版式)而不是"01_2006"
格式.
还要注意,在一个集合中包含多个文档并没有什么错.您只需将月份作为字段添加到文档中,如果需要,您可以按月过滤结果,使用索引不会更慢.如果您还存储时间戳或使用ObjectId
作为_id
,您甚至可以在不添加额外月份的情况下执行此操作.