3

指定された日付より古い Mongo の GridFS に保存されている一連のファイルを削除する必要があります。これは、 fs.filesコレクションとfs.chunksコレクションの両方から削除する必要があることを意味します。

検索条件に一致するfs.filesからすべてのドキュメントを見つけ、それらを繰り返し処理し、ループ内で fs.files の対応するドキュメントの files_id 値に一致するすべてのドキュメントを fs.chunks から削除する関数作成することを考えていましたが、 、ドキュメントによると:

MongoDB は、単一のドキュメントに対するアトミック操作をサポートしています。MongoDB は従来のロックと複雑なトランザクションをサポートしていません

これは、私が提案したアプローチが正しいものではないかもしれないと私に思わせます.

クライアント ドライバーの 1 つを使用して GridFS を直接操作できることはわかっています。たとえば、PHP を使用すると、次のように実装できます。

<?php
$grid = $db->getGridFS('fs');

$grid->remove(array(
    "uploadDate" => array(
        '$lt' => new MongoDate(strtotime("2011-02-01 00:00:00"))
    )
));

...しかし、mongoコンソールのみを使用してこれを達成したいと考えています。

では、 mongo コンソールまたは JS ファイルを使用して、両方のコレクションからfs.filesのフィールドに関する特定の基準に一致し、コンソールにフィードするファイルを削除するための推奨される方法は何ですか?

4

1 に答える 1

2

提案されたアプローチはほとんど正しいです。ファイルの内容への唯一のポインターは fs.files にあるため、最初にそれを削除し、チャンクの削除で問題が発生した場合、少なくともそれらのチャンクを参照できるものは何もありません。

安全のために、chunks コレクションの files_id フィールドを通過するバックグラウンド ジョブ (インデックスが作成されているため高速である必要があります) を使用し、すべての files_id が fs.files コレクション内のドキュメントと一致することを確認することができます。それらがなく、比較的最近作成されたものでない場合 (_id フィールドから作成されたタイムスタンプを取得できます)、それらを削除できます。(現在挿入されているファイルの一部である場合、最近作成されたチャンクを削除したくないでしょう。)

于 2011-07-28T14:52:12.623 に答える