假设我有一个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,您甚至可以在不添加额外月份的情况下执行此操作.

Mongodb相关问答推荐

MongoDb聚合查询问题

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

随着时间的推移在 mongodb 中获得

PHP 无法加载动态库 (mongo.so)

如何将查询结果(单个文档)存储到变量中?

MongoDB 文档操作是原子的和隔离的,但它们是否一致?

我怎样才能更快地scrape

如何在 MongoDB 中进行内部连接?

使用 mgo 存储嵌套 struct

MongoDB展开多个数组

如何使用 java 驱动程序更新 mongo db 中的文档字段?

MongoDB 存储 ObjectId 的数组

MongoDB:自动生成的 ID 为零

MongoDB - 我如何找到另一个集合中的文档未引用的所有文档

MongoDb 数据库与集合

RoboMongo:不显示所有文档

Mongoose:Model.create 和 Collection.insert 有什么区别

如何在mongoose的嵌套填充中 Select 特定字段

我可以使用字符串作为 mongodb 文档的 ID 类型吗?

如何使用户的邮箱在 mongoDB 中唯一?