簡體   English   中英

MGO TTL索引創建以有選擇地刪除文檔

[英]MGO TTL indexes creation to selectively delete documents

我正在使用Golang和MongoDB。 我有一個集合需要保存一個持久性或易變的文檔。 因此,如果它設置了一個過期日期(如示例expireAt ),則該文檔被視為易失性並被刪除,否則它將保留在集合中,除非它將被手動刪除。

閱讀本文檔后,我發現了一個可能正常工作的索引。

基本上我需要在mgo中復制這種索引:

db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )

db.log_events.insert( {
  "expireAt": new Date('July 22, 2013 14:00:00'),
  "logEvent": 2,
  "logMessage": "Success!"
} )

我已閱讀(我正在搜索此信息的來源),如果expireAt不是有效日期,則不會觸發刪除。 因此,我認為我需要做的就是在需要時將expireDate設置為有效日期,否則我將把它留給Go time.Time零值。

這是我的代碼庫

type Filter struct {
    Timestamp time.Time     `bson:"createdAt"`
    ExpireAt  time.Time     `bson:"expireAt"`
    Body      string        `bson:"body"`
}

// Create filter from data received via REST API.
var filter Filter
timestamp := time.Now()

if theUserAction == "share" { // This is action will set the document as volatile
    filter.ExpireAt = time.Now().Add(24 * time.Hour * 14)
}

filter.Timestamp = timestamp
filter.Body = "A BODY"

// Store filter in database
session, err := mdb.GetMgoSession() // This is a wrapping method that returns a valid mgo session
if err != nil {
    return NewErrorInternal("Error connecting to database", err)
}
defer session.Close()


// Get db with global data for legent
collection := session.DB(database).C(filtersCollection)

我的問題是:我如何設置索引,以便在expireAt密鑰有效時刪除文件? 閱讀有關索引類型mgo文檔 ,似乎沒有辦法復制先前聲明的索引,因為庫只提供ExpireAfter字段。

此外,假設mongodb可以將zerovalue解釋為無效日期是有效的嗎?

從文檔來看,它是January 1, year 1, 00:00:00.000000000 UTC ,實際上似乎是一個有效的日期..

到目前為止我所想的是做這樣的事情:

filtIdx := mgo.Index{
    Key:        []string{"expireAt"},
    Unique:     false,
    Background: true,
    Sparse:     false,
    ExpireAfter: 0,
}

如何設置索引,以便在expireAt密鑰有效時它將刪除文檔?

使用mgo.v2設置TTL索引的示例如下:

index := mgo.Index{
    Key:         []string{"expireAt"},
    ExpireAfter: time.Second * 120, 
}
err = coll.EnsureIndex(index)

上述示例設置為120秒到期。 另請參閱通過設置TTL從集合中過期數據

是否仍然可以使一些文件完全沒有過期? 由於這是我期待獲得一個集合的行為,其中一些文檔到期而其他文檔仍然持久

您可以為ExpireAt struct字段指定omitempty標志,如下所示:

type Filter struct {
    Timestamp time.Time `bson:"createdAt"`
    Body      string    `bson:"body"`
    ExpireAt  time.Time `bson:"expireAt,omitempty"`
}

如果字段未設置為零值,則基本上僅包括該字段。 查看更多信息mgo.v2 bson.Marshal

現在,例如,您可以插入兩個文檔,其中一個文檔將過期而另一個文檔仍然存在。 代碼示例:

var foo Filter
foo.Timestamp = timestamp
foo.Body = "Will be deleted per TTL index"
foo.ExpireAt = time.Now()
collection.Insert(foo)

var bar Filter
bar.Timestamp = timestamp
bar.Body = "Persists until expireAt value is set"
collection.Insert(bar)

稍后,您可以使用Update()設置expireAt字段,例如:

newValue := bson.M{"$set": bson.M{"expireAt": time.Now()}}
err = collection.Update(queryFilter, newValue)

expireAt字段設置有效時間值將使其符合TTL索引的條件。 即不再存在。

根據您的使用情況,您也可以刪除()文檔,而不是更新和依賴TTL索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM