2016-04-19 7 views
2

私は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, 
} 
+0

私は間違っているかもしれませんが、私の頭の上から離れて、私は 'expireAfterSeconds:0'が実際には' 0'値で無視されると思います。なぜなら、私はそれが正の値である必要があると信じているからです。とにかく毎分TTLクリーンアッププロセスが実行されるため、60秒未満の有効期限は少なくとも1分以上長くなります。残りの部分について言えば、「できません」と言っているわけではありませんが、Goコードでインデックスを定義するユーティリティを再考する必要があります。インデックスは一度だけ定義する必要があるため、一般的なコードに含めるのではなく、「展開スクリプト」で最もよく実装されます。 –

+0

他の日付キーでインデックスを期限切れにしたい場合は、doc自身で 'expireAfterSeconds:0'を指定します。索引が作成される場所については、ええ、そうです。実際には、実際に配備スクリプトにあります。 – FredMaggiowski

+0

あなたはなぜ私がドキュメントについて何か知らせていると思いますか?それはまったくのことではなく、あなたが使うことができる "唯一の"キーは、インデックスに指定された "特異な"データです。そして、 "それ"はまさにドキュメンテーションが言っているものです。正直なところ、すべてのコメントにユーザープロファイルへのリンクがあります。あなたが一瞬見ていたら、あなたが "知らせる"人は自分よりもはるかに優れた概念を持っていることを理解していて、 "あなたに良いアドバイスをしてくれました"。 –

答えて

2

をexpireAtキーが有効な場合、ドキュメントを削除するようにインデックスを作成しますか?

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も参照してください。

一部のドキュメントを期限切れにしないようにすることはできますか?

type Filter struct { 
    Timestamp time.Time `bson:"createdAt"` 
    Body  string `bson:"body"` 
    ExpireAt time.Time `bson:"expireAt,omitempty"` 
} 

、本質的に:これが動作ですので、私はいくつかの文書が他の

永続的なままあなたは以下のようにExpireAt構造体フィールドのomitemptyフラグを指定することができます有効期限が切れるか、コレクションを取得するために楽しみにしていますゼロ値に設定されていない場合にのみフィールドを含めるようにしてください。詳細情報を表示mgo.v2 bson.Marshal

たとえば、期限切れになる文書と2つ目の文書が存続する場合は、2つの文書を挿入できます。コード例:それはTTLの資格になるだろう、expireAtフィールドに有効な時間の値を設定する

newValue := bson.M{"$set": bson.M{"expireAt": time.Now()}} 
err = collection.Update(queryFilter, newValue) 

後で
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フィールドを設定することができますインデックス。すなわちもはや存続しない。

あなたのユースケースによっては、TTLインデックスを更新したり依存したりする代わりに、Remove()のドキュメントを使用することもできます。

+0

この問題を抱えていたので、@ワンは答えました。解決策を検証するためにそれをテストします。とにかく完璧なようです。私はGobの「omitempty」キーワードについては考えていませんでした。その点は、0値のTimeの挿入を避け、そのドキュメントのインデックスの「無効化」を引き起こすことです。私はそれを正しく得たか?今のところ私は答えをアップアップしています。私はそれを受け入れるためにできるだけ早くテストします! :) – FredMaggiowski

関連する問題