在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中文網其他相關文章!