2011-12-15 24 views
8

Yüklenmiş dosyaları GridFS sistemine depolayan bir blog sistemim var. Sorun şu ki, nasıl sorgulanacağını anlamıyorum!MongoDB GridFS Sorgulaması?

Henüz GridFS'yi desteklemeyen NodeJS ile Mongoose kullanıyorum, bu yüzden GridFS işlemleri için gerçek mongodb modülünü kullanıyorum. Belgeleri düzenli bir koleksiyonda yaptığınız gibi meta verileri sorgulamak için SEEM yoktur.

Meta verileri GridFS objectId işaret eden bir belgede depolamak akıllıca olur mu? kolayca sorgulamak mümkün?

Herhangi bir yardım büyük takdir, im tür sıkışmış:/

cevap

18

GridFS eserleri gibi sorgulayabilir. Bu şekilde, tüm dosyayı RAM'da saklamak zorunda kalmadan çok büyük dosyaları teslim edebilir ve depolayabilirsiniz. Ayrıca, bu, maksimum belge boyutundan daha büyük dosyaları depolamanıza olanak tanır. Önerilen yığın boyutu 256 kb'dir. Dosya meta veri alanı, meta verileri ayrı bir belgede depolamaktan daha verimli olabilen ek dosyaya özgü meta verileri depolamak için kullanılabilir. Bu, tam olarak sizin gereksinimlerinize bağlıdır, ancak meta veri alanı genel olarak çok fazla esneklik sunar. Eğer fs.files dosya belge getirmesi gerekecek aslında GridFS dosyayı okumak için

> 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" 
} 

ve parçaları dan: varsayılan olarak, daha açık meta bazıları zaten fs.files belgesinin parçası olduğunu unutmayın fs.chunks. Bunu yapmanın en etkili yolu, bunu istemcinin yığın-yığınına aktarmasıdır, böylece tüm dosyayı RAM'e yüklemeniz gerekmez. chunks toplama aşağıdaki yapıya sahiptir:

> 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 */ 
} 

Eğer dot notation mutlaka öğrenin, mesela senin sorguları için fs.files ait metadata alanını kullanmak isterseniz

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

da sorgularınız explain() kullanarak bir dizin kullanabilirsiniz emin olun.

+0

Bir meta veri alanında kullanılabilir dizin oluşturmak nasıl oluşturulur? –

+0

Basitçe bir şemaya sahip olmayan bir şemaya sahip olmama gibi bir indeksi oluşturabilirsiniz. – mnemosyn

0

meta meta veri alanına depolanır. Bunu her dosya için parçalara bir dizi depolayarak

db.fs.files.find({metadata: {content_type: 'text/html'}}) 
+3

Bu neyi OP muhtemelen değil bekliyor. Bu sözdizimi, altyazının * kesin * eşleşmelerini arar, yani sorgunuz ** eşleşmez "metadata": {"content_type": "text/html", "foo": "bar"} '. Ayrıca, örnek kafa karıştırıcı olabilir çünkü 'content_type'' fs.files' yapısının bir parçasıdır, ancak burada farklı bir adı vardır. – mnemosyn

6

specification'un söylediği gibi, istediğiniz meta verileri alanında saklayabilirsiniz.dosyaları koleksiyonundan bir belge nasıl göründüğünü İşte

var:

Gerekli alanlar Yani metaverilerde istediğiniz bir şey saklamak

{ 
    "_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 
} 

İsteğe bağlı alanlar

{  
    "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 
} 

ve normalde MongoDB'de yaptığınız gibi sorgula:

db.fs.files.find({"metadata.some_info" : "sample"}); 
1

ben soru meta verileri sorgulama Java yol hakkında sormuyor biliyorum ama burada bir meta veri alanı olarak gender eklemek varsayarak geçerli:

// 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()); 
} 
+0

Neden başparmak aşağı? – javaauthority