我正在嘗試使用mongo-go-driver做一些簡單的事情。我在集合中插入了一些數(shù)據(jù),我希望它們在幾秒鐘后被自動刪除。我已閱讀以下文檔:https ://docs.mongodb.com/manual/tutorial/expire-data/#expire-documents-after-a-specified-number-of-seconds然后我在 GO 中寫了一些東西,但它似乎沒有像我預(yù)期的那樣工作。也許有些東西我沒有得到,或者我做錯了。package mainimport ( "bytes" "context" "fmt" "log" "text/tabwriter" "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 index to col // the goal is to set a TTL for datas to only 1 secondes (test purpose) 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 datas each seconds 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) } // display all 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) }
1 回答

aluckdog
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個贊
您的示例沒有任何問題,它有效。
請注意,expireAfterSeconds
您指定的時間createdAt
是文檔過期后的持續(xù)時間,而該時刻是文檔可能被刪除的最早時間,但不能保證刪除會“立即”發(fā)生,即在那個時間。
TTL 索引不保證過期數(shù)據(jù)會在過期后立即被刪除。文檔過期和 MongoDB 從數(shù)據(jù)庫中刪除文檔的時間之間可能存在延遲。
刪除過期文檔的后臺任務(wù)每 60 秒運(yùn)行一次。因此,在文檔到期和后臺任務(wù)運(yùn)行之間的時間段內(nèi),文檔可能會保留在集合中。
由于刪除操作的持續(xù)時間取決于您的mongod實(shí)例的工作負(fù)載,因此在后臺任務(wù)運(yùn)行之間的 60 秒時間間隔之后,過期數(shù)據(jù)可能會存在一段時間。
如您所見,如果一個文檔過期,最壞的情況下,后臺任務(wù)可能需要 60 秒才能啟動并開始刪除過期文檔,如果有很多(或數(shù)據(jù)庫負(fù)載過重),則可能需要一些是時候刪除所有過期的文件了。
- 1 回答
- 0 關(guān)注
- 328 瀏覽
添加回答
舉報
0/150
提交
取消