- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 Golang 和 MongoDB。我有一个集合需要保存一个可以持久或易变的文档。因此,如果它设置了一个过期日期(例如 expireAt
),该文档将被认为是易变的并被删除,否则它将保留在集合中,除非它被手动删除。
阅读 this doc我找到了一个索引,它可能会在我需要时起作用。
基本上我需要在 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 documentation about Index Type似乎没有办法复制先前声明的索引,因为该库仅提供 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,
}
最佳答案
How can I set the index thus that it'll delete the document IF the expireAt key is valid?
使用 mgo.v2 设置 TTL 索引的示例如下:
index := mgo.Index{
Key: []string{"expireAt"},
ExpireAfter: time.Second * 120,
}
err = coll.EnsureIndex(index)
上面的示例设置为 120 秒的过期时间。另见 Expire Data from Collections by Setting TTL .
Is it still possible to make some documents to not expire at all? Since this is the behaviour I'm looking forward to obtain a collection where some documents do expire while other remain persistent
您可以为 ExpireAt
结构字段指定 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 索引。即不再存在。
根据您的用例,您也可以选择 Remove()文档而不是更新和依赖 TTL 索引。
关于mongodb - MGO TTL 索引创建以选择性地删除文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720669/
根据这个: Selectivity is the value between 0 and 1, and it is the fraction of rows returned after applyi
我想知道C是否允许设置选择性#define。这就是我所说的选择性:如果我定义了一个结构: typedef struct mystruct{ int (*pointer_function)(struc
我正在尝试替换 pi与 math.pi使用以下 Python 函数。 def cleanup(x): return x.replace("pi", "math.pi") 我有以下字符串: a =
有没有一种方法可以只对类型声明可用的代码执行流程检查? 有一种方法可以启用每个文件的检查( header 中的 //@flow),但是一旦设置,代码的所有部分都需要类型声明(否则会记录错误,如“108
我在 openGL (openGl 1.1 win32) 中绘制了一个场景。 我使用 glClipPlane 隐藏前景对象以允许用户查看/编辑距离部分。选择是在 native 完成的,无需使用 ope
我正在开发允许第三方上传 HTML 片段的服务。在其中一些片段中,可能有指向 CSS 文件或内联 CSS 的链接。该服务有自己的 CSS 文件。 除了 iFrame 之外,还有什么方法可以让我指示特定
假设我有下面列出的用于通过 Web 服务将数据传递给客户端的类(类已简化): public class Customer { public int CustomerId { get; set;
我肯定有一个相当普遍的文档需求...... 我正在实现一个相当大的 Java 库代码库,除其他外,它包含各种类,这些类旨在在适当的抽象级别上公开给调用者/实现者。同时,代码库当然包含库的用户在使用 A
我有我的小 program.jar,它使用了巨大的 library.jar 的一小部分。 是否有一种工具可以将几个 jar 重新打包成一个,以便它可以独立运行并且尽可能小? 更新:大小很重要。 最佳答
如何为站点的某些部分强制使用 HTTPS,例如登录页面或注册页面,并为站点的其余部分使用 HTTP? 最佳答案 我最喜欢的强制转换为 https 的方法是将其作为您的 php 脚本中的第一件事。它适用
我一直在慢慢学习 Ruby(在这一点上,这可能是我投入大量时间实际学习的第一门语言)所以这对你们中的许多人来说可能是一个非常简单的问题。 我的学习玩具项目基本上是一个 roguelike。目前,我有一
我正在使用Liip Cache Control bundle处理项目中的缓存。通过使用此捆绑包,您可以像这样配置缓存: liip_cache_control: rules: -
在上个月的某个时候,一个随机网站决定在一个框架中为我公司的网站提供服务。忽略“他们在做什么?”的问题。一分钟,我使用了一些简单的 frame-buster Javascript: if (top.l
假设我有以下 Numpy 数组: array([[3, 5, 0], [7, 0, 2]]) 我现在想在值不为 0 的地方加 2。最快的方法是什么?我必须操纵相当大的多维数组? 最佳答案 在我看来:
我是 git 的新手,我正尝试在 Github 项目上进行协作。我 fork 了一个项目,添加了功能,并根据自己的需要移植到了 Android。添加的功能需要在基础项目中,而不是 android 相关
在以下两个命令中,第二个抛出异常说“未知编解码器 libfdk_aac”。谁能指出我,可能是什么问题? $> ffmpeg -loglevel verbose -re -i /var/mp4s/tes
我正在尝试 nvidia 的展开循环指令,但还没有找到有选择地打开它的方法。 假设我有这个... void testUnroll() { #pragma optionNV(unroll all
我们公司最近开始使用git-flow,我们遇到了以下问题: 我们有一个控制应用程序日志级别的 DEV_MODE bool 值,我们希望开发分支始终具有 DEV_MODE=true。 但是,在发布版本时
我试图在我的 DataFrame df 中删除 nan 值,但是我很难在不影响整行的情况下删除每一列。下面是我的 df 示例。 Advertising No Advertising nan
我已将播放服务更新到最新版本,目前为 9.2.0,我还想为谷歌播放服务使用选择性模块。 // compile 'com.google.android.gms:play-services:9.2.
我是一名优秀的程序员,十分优秀!