1 回答
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 索引。
添加回答
举报