猿问

MGO TTL 索引创建以有选择地删除文档

我正在使用 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 设置为有效日期,否则我会将其保留为 Gotime.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 解释为无效日期是否有效?


从文档来看,January 1, year 1, 00:00:00.000000000 UTC 它实际上似乎是一个有效日期..


到目前为止我所想的是做这样的事情:


filtIdx := mgo.Index{

    Key:        []string{"expireAt"},

    Unique:     false,

    Background: true,

    Sparse:     false,

    ExpireAfter: 0,

}


GCT1015
浏览 154回答 1
1回答

30秒到达战场

如何设置索引,以便在 expireAt 键有效时删除文档?使用mgo.v2设置 TTL 索引的示例如下:index := mgo.Index{    Key:         []string{"expireAt"},    ExpireAfter: time.Second * 120, }err = coll.EnsureIndex(index)上面的示例设置为 120 秒的到期时间。另请参阅通过设置 TTL 使集合中的数据过期。是否仍然可以使某些文件完全不过期?由于这是我期待获得一个集合的行为,其中某些文档确实过期而其他文档仍然存在您可以omitempty为ExpireAt结构字段指定标志,如下所示:type Filter struct {    Timestamp time.Time `bson:"createdAt"`    Body      string    `bson:"body"`    ExpireAt  time.Time `bson:"expireAt,omitempty"`}如果字段未设置为零值,则基本上只包含该字段。查看更多信息mgo.v2 bson.Marshal现在,例如,您可以插入两个文档,其中一个会过期,而另一个会保留。代码示例:var foo Filterfoo.Timestamp = timestampfoo.Body = "Will be deleted per TTL index"foo.ExpireAt = time.Now()collection.Insert(foo)var bar Filterbar.Timestamp = timestampbar.Body = "Persists until expireAt value is set"collection.Insert(bar)稍后,您可以expireAt使用Update()设置字段,例如:newValue := bson.M{"$set": bson.M{"expireAt": time.Now()}}err = collection.Update(queryFilter, newValue)为expireAt字段设置有效的时间值,将使其符合 TTL 索引的条件。即不再坚持。根据您的用例,或者您也可以Remove()文档而不是更新和依赖 TTL 索引。
随时随地看视频慕课网APP

相关分类

Python
我要回答