0

200 万を少し下回るドキュメントを含む mongo コレクションがあり、日付フィールドに基づいて約 700,000 個のドキュメントを削除するクエリを実行したいと考えています。

削除クエリは次のようになります。

db.collection.remove({'timestamp': { $lt: ISODate('XXXXX') }})

この場合、正確な日付は重要ではありません。構文は正しく、動作することはわかっています。ただし、永遠にかかることもわかっています (前回同様のことを行ったときは、2 時間弱かかりました)。

同時にレコードを挿入および更新する別のプロセスがあり、それを止めることはできません。ただし、これらの挿入/更新が「最終的に」実行される限り、それらが延期されてもかまいません。

私の質問は次のとおりです。特定のクエリ/操作の優先度を設定して、後で送信されるすべてのクエリの前に/より高速に実行する方法はありますか? この場合、mongo はデータベースの内外で大量のデータを交換する必要があり、パフォーマンスが向上していないと思います。

4

2 に答える 2

0

優先順位を微調整できるかどうかわからないので、もっと良い答えがあるかもしれません。

簡単な回避策は、ドキュメントで提案されているものかもしれません:

:大規模な削除操作の場合、保存するドキュメントを新しいコレクションにコピーしてからdrop()、元のコレクションで使用する方が効果的な場合があります。

もう1つのアプローチは、たとえば500個の要素をフェッチし、を使用してそれらを削除する単純なスクリプトを作成すること$inです。sleep()削除プロセスを抑制するために、ある種を追加することができます。これはニュースグループで推奨されました

将来この問題が発生する場合は、

  • 毎日のコレクションを使用して、データが十分に古くなったらコレクション全体を削除できるようにします(これにより、集計が困難になります)
  • アイテムが自動的にタイムアウトし、まとめて削除する必要がないTTLコレクションを使用します。
于 2013-02-04T14:19:17.303 に答える
0

アプリケーションで一定期間より古いデータを削除する必要がある場合は、TTL インデックスを使用することをお勧めします。例 (mongodb サイトから):

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )

これは、データが時間によって削除されることを除いて、上限付きコレクションのように機能します。あなたにとっての最大の利点は、バックグラウンド スレッドで動作することです。挿入/更新はほとんど影響を受けません。私は本番環境のSaaSベースの製品でこの手法を使用していますが、魅力的です。

これはあなたのユースケースではないかもしれませんが、お役に立てば幸いです。

于 2013-02-04T15:31:28.600 に答える