2017-11-04 10 views
0

メールを確認しないと3日後にユーザーアカウントを削除します。スケジューラーが非効率的なので、私はMongoDBでこの削除をスケジュールする方法を探しています。ユーザーが電子メールを確認した場合、キャンセルする方法も必要です。N日後にMongoDB文書を削除する

私はMongoDB用のapiとしてmgoを使用しています。最新のGo(1.9)を実行しています。

+0

[TTLを設定してコレクションのデータを期限切れにする](https://docs.mongodb.com/manual/tutorial/expire-data/)実際の検索結果の種類。 –

+0

[MongoDB:コレクションから古いレコードを削除するにはどうすればいいですか?](https://stackoverflow.com/questions/46441006/mongodb-how-to-remove-older-records-from-a-collection) –

答えて

1

これは、あなたがpartial index expressionでのMongoDBのTTLインデックスを一緒に使用することができますMongoDBのバージョン3.4

で達成することができます。

db.users.ensureIndex(
{ created_at:1}, 
{ expireAfterSeconds:259200, 
    partialFilterExpression:{"verified" : false}}) 

検証されていないと、それらが追加されたので、3日となっている、削除、すべてのそれらのユーザーを持つこのTTLインデックス:usersコレクションで、次のインデックスを追加

してみてください。

+0

ありがとう。誰かがアカウントを確認したときにこの小切手を取り除くこともできますか?だからmongodbは毎回これをチェックしません。また、ドキュメントを作成した時点、またはこのコマンドを実行したときの相対的なexpireAfterSecondsも表示されます。 – Florian

+0

最初の部分については、これをアプリ側から更新する必要があります(ユーザーが承認するとtrueに設定されます)。 expireAfterSecは、ドキュメントを作成した時間を示します。 – Astro

+0

@Florian TTL expieriesを実行しているバックグラウンドプロセスは、何時(iirc、TTLインデックスがない場合でも)毎分実行されます。心配する必要はありません。 –

0

モンゴのTTLインデックスのみ私が考えることができる唯一の回避策はないさらなる条件ロジックを超える

if NowDate() > fieldDate { killMe() }

を日時をサポート...(MongoDB documentation:から抽出された)

If the indexed field in a document is not a date or an array that holds a date value(s), the document will not expire.

フィールドをnullに設定すると、ユーザーが電子メールを確認したときにこのトリックを行うことができます。

歓声

関連する問題