私はGolangとMongoDBで作業しています。私は、永続的または揮発性の文書を保持する必要があるコレクションを持っています。したがって、期限が設定されている場合(例:expireAt
)、文書は揮発性とみなされ、それ以外の場合は手動で削除されない限りコレクションに保存されます。文書を選択的に削除するためのMGO TTLインデックスの作成
読書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
場を提供するので、前述のインデックスを複製する方法は、ありますようにそれは...、それはzerovalueとしてのMongoDBによって解釈される可能性があることを前提とするために有効です。また
思われません無効な日付ですか?それが実際に有効な日付のように思えるJanuary 1, year 1, 00:00:00.000000000 UTC
あるドキュメントから
..
私はこれまで考えたことは、このような何かやっている:私は設定することができますどのように
filtIdx := mgo.Index{
Key: []string{"expireAt"},
Unique: false,
Background: true,
Sparse: false,
ExpireAfter: 0,
}
私は間違っているかもしれませんが、私の頭の上から離れて、私は 'expireAfterSeconds:0'が実際には' 0'値で無視されると思います。なぜなら、私はそれが正の値である必要があると信じているからです。とにかく毎分TTLクリーンアッププロセスが実行されるため、60秒未満の有効期限は少なくとも1分以上長くなります。残りの部分について言えば、「できません」と言っているわけではありませんが、Goコードでインデックスを定義するユーティリティを再考する必要があります。インデックスは一度だけ定義する必要があるため、一般的なコードに含めるのではなく、「展開スクリプト」で最もよく実装されます。 –
他の日付キーでインデックスを期限切れにしたい場合は、doc自身で 'expireAfterSeconds:0'を指定します。索引が作成される場所については、ええ、そうです。実際には、実際に配備スクリプトにあります。 – FredMaggiowski
あなたはなぜ私がドキュメントについて何か知らせていると思いますか?それはまったくのことではなく、あなたが使うことができる "唯一の"キーは、インデックスに指定された "特異な"データです。そして、 "それ"はまさにドキュメンテーションが言っているものです。正直なところ、すべてのコメントにユーザープロファイルへのリンクがあります。あなたが一瞬見ていたら、あなたが "知らせる"人は自分よりもはるかに優れた概念を持っていることを理解していて、 "あなたに良いアドバイスをしてくれました"。 –