sql >> データベース >  >> NoSQL >> MongoDB

GridFを使用してJSONファイルを保存する方法

    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なし)に保存します。

    詳細

    あなたの場合、データは非常に大きいので、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!'))
      ;
    });
    


    1. IDでレコードを削除しますか?

    2. MongoDB-Javaドライバー:挿入が失敗したときに例外をキャッチ

    3. mongodbは埋め込みドキュメントの値を集約します

    4. MongoDB LinQ Selectメソッドは、実際にはフィールドのサブセットのみを取得しますか?