GridFSを使用してMongoにデータを保存する価値がない可能性が非常に高いです。
バイナリデータが実際にデータベースに属することはありませんが、データが小さい場合は、データをデータベースに配置することの利点(クエリ機能)が欠点(サーバーの負荷、低速)を上回ります。
この場合、GridFSにドキュメントデータ(JSON)を保存したいようです。これを実行して、他のバイナリデータを保存するのと同じ方法で保存できます。ただし、データは不透明になります。 GridFSドキュメントに保存されているJSONデータをクエリすることはできず、ファイルメタデータのみをクエリできます。
ビッグデータのクエリ
データをクエリする必要があると述べたように、データの形式を確認する必要があります。データが例にリストされている形式である場合、複雑なクエリは必要なく、文字列照合のみが必要であるように見えます。したがって、いくつかのオプションがあります。
ケース1:大規模なデータ、少数のポイント
データセットが少ない場合(field1
のペア およびfield2
)ただし、それぞれのデータは大きい(field2
多くのバイトが含まれています)、これらを他の場所に保存し、それへの参照のみを保存します。簡単な解決策は、データ(以前のfield2
)を保存することです。 )Amazon S3のテキストファイルに保存し、リンクを保存します。例:
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
ケース2:小さなデータ、多くのポイント
各データセットが小さい(16 MB未満)が、データセットが多い場合は、データをMongoDB(GridFSなし)に保存します。
詳細h2>
あなたの場合、データは非常に大きいので、GridFSを使用して保存することはお勧めできません。
この回答 下に向かってベンチマークを提供します。ベンチマークは、取得時間がファイルサイズにほぼ正比例することを示しているようです。同じ設定で、データベースからドキュメントを取得するのに80秒かかります。
可能な最適化
GridFSのデフォルトのチャンクサイズは255KiBです。チャンクサイズを最大(16 MB)に増やすことで、大きなファイルへのアクセス時間を短縮できる場合があります。チャンクサイズが唯一のボトルネックである場合、16 MBのチャンクサイズを使用すると、取得時間が80秒から1.3秒に短縮されます(80 /(16MB / 255KiB)=1.3)。これは、GridFSバケットを初期化するときに実行できます。
new GridFSBucket(db, {chunkSizeBytes: 16000000})
より良い戦略は、Mongoに唯一のファイル名を保存し、代わりにファイルシステムからファイルを取得することです。
その他の欠点
バイナリデータをMongoに保存する際に考えられるもう1つの欠点は、このサイト :"バイナリデータが大きい場合、バイナリデータをメモリにロードすると、頻繁にアクセスされるテキスト(構造化データ)ドキュメントがメモリから押し出される可能性があります。より一般的には、ワーキングセットがRAMに収まらない可能性があります。これは悪影響を与える可能性があります。データベースのパフォーマンス。」 [ 1 ]
例
MongoGridFSチュートリアルを基にしたファイルをGridFSに保存する
const uri = 'mongodb://localhost:27017/test';
mongodb.MongoClient.connect(uri, (error, db) => {
const bucket = new mongodb.GridFSBucket(db);
fs.createReadStream('./fasta-data.json')
.pipe(bucket.openUploadStream('fasta-data.json'))
.on('finish', () => console.log('done!'))
;
});