为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2022-01-04 20:59:51
我正在使用 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 Filtertimestamp := 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 = timestampfilter.Body = "A BODY"// Store filter in databasesession, err := mdb.GetMgoSession() // This is a wrapping method that returns a valid mgo sessionif err != nil {    return NewErrorInternal("Error connecting to database", err)}defer session.Close()// Get db with global data for legentcollection := 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,}
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

如何设置索引,以便在 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 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)

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


newValue := bson.M{"$set": bson.M{"expireAt": time.Now()}}

err = collection.Update(queryFilter, newValue)

为expireAt字段设置有效的时间值,将使其符合 TTL 索引的条件。即不再坚持。


根据您的用例,或者您也可以Remove()文档而不是更新和依赖 TTL 索引。


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信