在 Golang 中使用 Mongo 让文档在指定时间后过期
在 Golang 中,mongo-go-driver 提供了在指定时间后自动过期文档的功能指定的秒数。但是,某些用户可能会遇到此功能无法按预期运行的问题。
要解决此问题,遵守创建 expireAfterSeconds 索引的正确过程至关重要。这涉及到设置 TTL(生存时间)索引,该索引确定应删除文档的时间段。
过期文档的示例代码
<code class="golang">package main import ( "context" "fmt" "log" "time" "github.com/Pallinder/go-randomdata" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { ctx := context.TODO() client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { log.Fatal(err) } err = client.Connect(ctx) if err != nil { log.Fatal(err) } db := client.Database("LADB") col := db.Collection("LACOLL") // Add an index to the collection with an expireAfterSeconds option model := mongo.IndexModel{ Keys: bson.M{"createdAt": 1}, Options: options.Index().SetExpireAfterSeconds(1), } ind, err := col.Indexes().CreateOne(ctx, model) if err != nil { log.Fatal(err) } fmt.Println(ind) // Insert some documents with createdAt timestamp for i := 0; i < 5; i++ { name := randomdata.SillyName() res, err := col.InsertOne(ctx, NFT{Timestamp: time.Now(), CreatedAt: time.Now(), Name: name}) if err != nil { log.Fatal(err) } fmt.Println("Inserted", name, "with ID", res.InsertedID) time.Sleep(1 * time.Second) } // Find all documents in the collection cursor, err := col.Find(ctx, bson.M{}, nil) if err != nil { log.Fatal(err) } var datas []NFT if err = cursor.All(ctx, &datas); err != nil { log.Fatal(err) } // Note that there may be a delay in deleting expired documents (up to 60 seconds) fmt.Println(datas) } type NFT struct { ID primitive.ObjectID `bson:"_id,omitempty"` CreatedAt time.Time `bson:"createdAt,omitempty"` Timestamp time.Time `bson:"timestamp,omitempty"` Name string `bson:"name,omitempty"` }</code>
注意: MongoDB 用于删除过期文档的后台任务每 60 秒运行一次。因此,删除过期文档可能会有延迟,最长可达 60 秒。
以上是如何使用 Go-Mongo-Driver 确保 MongoDB 中的文档过期?的详细内容。更多信息请关注PHP中文网其他相关文章!