0

mongodb を使用するプラグインを開発しています。プラグインは、一部の .dcm ファイル (DICOM ファイル) をバイナリ ファイルとしてデータベースに格納する必要があります。その後、プラグインはファイルのメタデータを保存し、これらのメタデータのみに対して何らかのクエリを実行できるようにする必要があります。

当然のことながら、私は自分の問題に答えるために GridFs を選びました。同じファイルを使用して、バイナリ データをチャンク コレクションに格納し、メタデータをファイル コレクションのメタデータ フィールドに格納できるため (そして、MongoDB のサイズ制限を回避できます)。

しかし、別の問題が私に来ます。このソリューションは素晴らしいですが、バイナリ データとメタデータを同時に保存しています。説明させてください: 最初にバイナリ ファイルを保存し、その後、ファイルを取得してメタデータを読み取り、メタデータを同じファイルに保存します。いくつかの外部的な理由から、それは私にとって義務です。そのため、ファイルを取得して再度復元するのに多くの時間を失いました。既に保存されているファイルからメタデータを更新するには、次のコードを使用しています。

    GridFSDBFile file = saveFs.findOne(uri.getFileName());
    if (file == null) {
        return false;
    } else {
        file.setMetaData(new BasicDBObject());
        file.save();
        return true;
    }

主な問題は、ファイルを変更してから再度保存する前にファイルを見つけなければならないことです。

だから私の最初の質問は: findOne(String fileName) の代わりにデータベースからファイルを取得する最良の方法はありますか? メソッド findOne(ObjectID id) の方が速いですか? (ファイル名はデフォルトですでにインデックスされていると思うので、そうは思いませんよね?)

私はそれを行う別の方法を試しました。この問題を回避するために、バイナリ データ用とメタデータ用の 2 つの異なるファイルを保存することにしました。この場合、データベース内のファイルを取得する時間を失うことはありません。しかし、私は2倍以上のファイルを持っています...しかし、それを行うためのより良い方法が存在することはほぼ確実です!

2 番目の質問: 2 つの異なるコレクションを使用する必要があると思いますか? GridFs を使用してバイナリ データを格納するものと、従来の mongo ストレージ (または GridFS) を使用してメタデータのみを格納するもの。

私を読んでくれて、そしてあなたの答えをありがとう:)。

4

1 に答える 1