10

アップロードされたファイルを GridFS システムに保存するブログ システムがあります。問題は、クエリの方法がわかりません!

GridFS をまだサポートしていない NodeJS で Mongoose を使用しているため、GridFS 操作には実際の mongodb モジュールを使用しています。通常のコレクションでドキュメントを行うように、ファイルのメタデータをクエリする方法はないようです。

GridFS objectId を指すドキュメントにメタデータを保存するのは賢明でしょうか? 簡単にクエリできるようにするには?

どんな助けでも大歓迎です、私はちょっと立ち往生しています:/

4

4 に答える 4

23

GridFSは、ファイルごとに多数のチャンクを格納することで機能します。このようにして、ファイル全体を RAM に保存しなくても、非常に大きなファイルを配信および保存できます。また、これにより、最大ドキュメント サイズを超えるファイルを格納できます。推奨されるチャンク サイズは 256kb です。

ファイル メタデータ フィールドを使用して、追加のファイル固有のメタデータを格納できます。これは、メタデータを別のドキュメントに格納するよりも効率的です。これは正確な要件に大きく依存しますが、一般に、メタデータ フィールドは多くの柔軟性を提供します。fs.files明らかなメタデータの一部は、デフォルトですでにドキュメントの一部になっていることに注意してください。

> db.fs.files.findOne();
{
    "_id" : ObjectId("4f9d4172b2ceac15506445e1"),
    "filename" : "2e117dc7f5ba434c90be29c767426c29",
    "length" : 486912,
    "chunkSize" : 262144,
    "uploadDate" : ISODate("2011-10-18T09:05:54.851Z"),
    "md5" : "4f31970165766913fdece5417f7fa4a8",
    "contentType" : "application/pdf"
}

実際に GridFS からファイルを読み取るには、ファイル ドキュメントを からfs.files、チャンクを からフェッチする必要がありますfs.chunks。これを行う最も効率的な方法は、これをチャンクごとにクライアントにストリーミングすることです。そのため、ファイル全体を RAM にロードする必要はありません。chunksコレクションの構造は次のとおりです。

> db.fs.chunks.findOne({}, {"data" :0});
{
    "_id" : ObjectId("4e9d4172b2ceac15506445e1"),
    "files_id" : ObjectId("4f9d4172b2ceac15506445e1"),
    "n" : 0, // this is the 0th chunk of the file
    "data" : /* loads of data */
}

metadataクエリに のフィールドを使用する場合は、ドット表記fs.files理解していることを確認してください。

> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."), 
                    "metadata.ImageWidth" : 280});

また、クエリが を使用してインデックスを使用できることを確認してくださいexplain()

于 2011-12-15T09:26:50.953 に答える
7

仕様にあるように、メタデータフィールドには必要なものを何でも保存できます。

ファイルコレクションのドキュメントは次のようになります。

必須フィールド

{
  "_id" : <unspecified>,                  // unique ID for this file
  "length" : data_number,                 // size of the file in bytes
  "chunkSize" : data_number,              // size of each of the chunks.  Default is 256k
  "uploadDate" : data_date,               // date when object first stored
  "md5" : data_string                     // result of running the "filemd5" command on this file's chunks
}

オプションのフィールド

{    
  "filename" : data_string,               // human name for the file
  "contentType" : data_string,            // valid mime type for the object
  "aliases" : data_array of data_string,  // optional array of alias strings
  "metadata" : data_object,               // anything the user wants to store
}

したがって、必要なものはすべてメタデータに保存し、MongoDBの場合と同じように通常どおりクエリを実行します。

db.fs.files.find({"metadata.some_info" : "sample"});
于 2011-12-15T09:29:53.140 に答える
2

質問がメタデータを照会するJavaの方法について尋ねていないことは知っていますがgender、メタデータフィールドとして追加すると仮定すると、次のとおりです。

// Get your database's GridFS
GridFS gfs = new GridFS("myDatabase);

// Write out your JSON query within JSON.parse() and cast it as a DBObject
DBObject dbObject = (DBObject) JSON.parse("{metadata: {gender: 'Male'}}");

// Querying action (find)
List<GridFSDBFile> gridFSDBFiles = gfs.find(dbObject);

// Loop through the results
for (GridFSDBFile gridFSDBFile : gridFSDBFiles) {
    System.out.println(gridFSDBFile.getFilename());
}
于 2015-06-02T16:09:01.300 に答える
0

メタデータは、メタデータ フィールドに格納されます。次のようにクエリできます

db.fs.files.find({metadata: {content_type: 'text/html'}}) 
于 2011-12-15T08:06:06.483 に答える