12

組み込みの TTL 機能を使用することを考えていましたが、有効期限を動的に変更するのは簡単ではありません。mongodb はデータをパージするバックグラウンド タスクを使用しているためです。"> certain_date" に基づいて独自のパージ関数をコーディングし、1 日に 1 回実行するという欠点はありますか? このようにして、TTL 値を動的に変更でき、この日付フィールドを単一のインデックスにする必要はありません。このフィールドを複雑なインデックス作成の一部として再利用して、インデックスの数を最小限に抑えることができます。

4

2 に答える 2

20

TTL コレクションの有効期限を設定するには、次の 2 つの方法があります。

  1. 索引の作成時にグローバル・レベルで
  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 })
于 2014-01-31T20:21:51.553 に答える
5

組み込みの TTL 機能を使用することを検討していますが、有効期限を動的に変更するのは簡単ではありません。

それは変です。なぜそれが問題になるのでしょうか?ドキュメントにフィールドがある場合、Expiresそのフィールドをいつでも更新して、ドキュメントの寿命を動的に延長または短縮できます。

"> certain_date" に基づいて独自のパージ関数をコーディングし、1 日に 1 回実行するという欠点はありますか?

  1. コーディング、文書化、および維持する必要があります
  2. 大量のドキュメントを削除すると、コストがかかり、多くの再注文が発生する可能性があります。パージをより頻繁に実行すると役立つ可能性があります

インデックスの数を最小限に抑えることは良いことですが、問題はそれが本当に努力する価値があるかどうかです。この質問に答えられるのはあなただけです。私のアドバイスは、可能であればすでにあるものから始めて、本当に必要な場合にのみ、より良いものを考え出すことです.

于 2013-10-01T08:51:43.997 に答える