我有一個博客系統,可以將上傳的文件存儲到GridFS系統中。問題是,我不明白如何查詢它!查詢MongoDB GridFS?
我正在使用Mongoose和NodeJS,它還不支持GridFS,所以我使用實際的MongoDB模塊進行GridFS操作。沒有SEEM是一種查詢文件元數據的方式,就像您在常規集合中查看文檔一樣。
將元數據存儲在指向GridFS objectId的文檔中是否明智?輕鬆就能查詢?
任何幫助,將不勝感激,即時通訊有點粘:/
我有一個博客系統,可以將上傳的文件存儲到GridFS系統中。問題是,我不明白如何查詢它!查詢MongoDB GridFS?
我正在使用Mongoose和NodeJS,它還不支持GridFS,所以我使用實際的MongoDB模塊進行GridFS操作。沒有SEEM是一種查詢文件元數據的方式,就像您在常規集合中查看文檔一樣。
將元數據存儲在指向GridFS objectId的文檔中是否明智?輕鬆就能查詢?
任何幫助,將不勝感激,即時通訊有點粘:/
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 */
}
如果你想使用的fs.files
爲您查詢metadata
場,請確保您瞭解dot notation,例如
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
還確保您的查詢可以使用索引使用explain()
。
元數據存儲在元數據字段。你可以查詢它像
db.fs.files.find({metadata: {content_type: 'text/html'}})
這可能不是什麼OP預計。該語法將查找子文檔的*精確*匹配,即您的查詢將**不匹配元數據:{「content_type」:「text/html」,「foo」:「bar」}`。另外,這個例子可能會讓人困惑,因爲`content_type`是`fs.files`結構的一部分,但是在那裏有不同的名字。 – mnemosyn 2011-12-15 09:30:42
正如specification所說,您可以在元數據字段中存儲任何您想要的內容。
下面是從文件中收集的文檔的樣子:
必填項
{
"_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"});
我知道這個問題不問關於查詢的元數據的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-17 12:21:08
你可以簡單地創建一個像{fs.files.metadata.my_field:1}這樣的索引`沒有一個模式大大簡化了一些事情 – mnemosyn 2015-06-17 13:26:18