組み込みの TTL 機能を使用することを考えていましたが、有効期限を動的に変更するのは簡単ではありません。mongodb はデータをパージするバックグラウンド タスクを使用しているためです。"> certain_date" に基づいて独自のパージ関数をコーディングし、1 日に 1 回実行するという欠点はありますか? このようにして、TTL 値を動的に変更でき、この日付フィールドを単一のインデックスにする必要はありません。このフィールドを複雑なインデックス作成の一部として再利用して、インデックスの数を最小限に抑えることができます。
2 に答える
TTL コレクションの有効期限を設定するには、次の 2 つの方法があります。
- 索引の作成時にグローバル・レベルで
- ドキュメントごと、ドキュメント内のフィールドとして
これらのモードは排他的です。
グローバル有効期限
すべてのドキュメントを作成後 3 か月で期限切れにする場合は、次のようにインデックスを作成して最初のモードを使用します。
db.events.ensureIndex({ "createdAt": 1 }, { expireAfterSeconds: 7776000 })
後で有効期限を「4 か月」に変更する場合は、collModコマンドを使用して expireAfterSeconds の値を更新するだけです。
db.runCommand({"collMod" : "events" , "index" : { "keyPattern" : {"createdAt" : 1 } , "expireAfterSeconds" : 10368000 } })
ドキュメントごとの有効期限
すべてのドキュメントに独自の有効期限を設定したい場合は、特定の日付を「expiresAt」などのフィールドに保存してから、コレクションに次のインデックスを付けます。
db.events.ensureIndex({ "expiresAt": 1 }, { expireAfterSeconds: 0 })
組み込みの TTL 機能を使用することを検討していますが、有効期限を動的に変更するのは簡単ではありません。
それは変です。なぜそれが問題になるのでしょうか?ドキュメントにフィールドがある場合、Expires
そのフィールドをいつでも更新して、ドキュメントの寿命を動的に延長または短縮できます。
"> certain_date" に基づいて独自のパージ関数をコーディングし、1 日に 1 回実行するという欠点はありますか?
- コーディング、文書化、および維持する必要があります
- 大量のドキュメントを削除すると、コストがかかり、多くの再注文が発生する可能性があります。パージをより頻繁に実行すると役立つ可能性があります
インデックスの数を最小限に抑えることは良いことですが、問題はそれが本当に努力する価値があるかどうかです。この質問に答えられるのはあなただけです。私のアドバイスは、可能であればすでにあるものから始めて、本当に必要な場合にのみ、より良いものを考え出すことです.