2011-12-15 7 views
8

मेरे पास एक ब्लॉगिंग सिस्टम है जो अपलोड की गई फ़ाइलों को ग्रिडएफएस सिस्टम में संग्रहीत करता है। समस्या यह है कि, मैं समझ नहीं पा रहा हूं कि इसे कैसे पूछें!मोंगोडीबी ग्रिडएफएस पूछताछ?

मैं नोडजेस के साथ मोंगोस का उपयोग कर रहा हूं जो अभी तक ग्रिडएफएस का समर्थन नहीं करता है इसलिए मैं ग्रिडएफएस संचालन के लिए वास्तविक मोंगोडब मॉड्यूल का उपयोग कर रहा हूं। फ़ाइलों को मेटाडेटा से पूछताछ करने का कोई तरीका नहीं है जैसे आप नियमित संग्रह में दस्तावेज़ करते हैं।

क्या ग्रिडएफएस ऑब्जेक्ट आईडी को इंगित करने वाले दस्तावेज़ में मेटाडेटा को स्टोर करना बुद्धिमान होगा? आसानी से पूछने में सक्षम होने के लिए?

कोई मदद काफी सराहना की जाएगी, IM थोड़े अटक:/

उत्तर

18

GridFS काम करता है की तरह क्वेरी कर सकते हैं। इस तरह, आप रैम में पूरी फ़ाइल को स्टोर किए बिना बहुत बड़ी फ़ाइलों को डिलीवर और स्टोर कर सकते हैं। साथ ही, यह आपको उन फ़ाइलों को संग्रहीत करने में सक्षम बनाता है जो अधिकतम दस्तावेज़ आकार से बड़े हैं। अनुशंसित खंड आकार 256 केबी है।

फ़ाइल मेटाडेटा फ़ील्ड का उपयोग अतिरिक्त फ़ाइल-विशिष्ट मेटाडेटा को संग्रहीत करने के लिए किया जा सकता है, जो एक अलग दस्तावेज़ में मेटाडेटा को संग्रहीत करने से अधिक कुशल हो सकता है। यह आपकी सटीक आवश्यकताओं पर निर्भर करता है, लेकिन मेटाडाटा फ़ील्ड, सामान्य रूप से, बहुत लचीलापन प्रदान करता है। ध्यान रखें कि और अधिक स्पष्ट मेटाडाटा में से कुछ पहले से ही 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। ऐसा करने का सबसे प्रभावी तरीका क्लाइंट खंड-दर-खंड में स्ट्रीम करना है, इसलिए आपको पूरी फ़ाइल को रैम में लोड करने की आवश्यकता नहीं है। 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() का उपयोग कर का उपयोग कर सकते हैं।

+0

कोई मेटाडेटा फ़ील्ड पर उपयोग करने योग्य अनुक्रमणिका कैसे बनाएगा? –

+0

आप बस {{fs.files.metadata.my_field: 1} जैसे इंडेक्स बना सकते हैं, 'स्कीमा नहीं होने से कुछ चीजों को सरल बनाता है – mnemosyn

0

मेटाडाटा मेटाडाटा क्षेत्र में संग्रहित है। आप इसे प्रत्येक फ़ाइल के लिए मात्रा के एक नंबर भंडारण के द्वारा

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

यह शायद क्या ओ पी नहीं है उम्मीद है। वह वाक्यविन्यास उप-दस्तावेज के * सटीक * मैचों की तलाश करेगा, यानी आपकी क्वेरी ** ** ** "मेटाडाटा" से मेल नहीं खाएगी: {"content_type": "text/html", "foo": "bar"} '। साथ ही, उदाहरण भ्रमित हो सकता है क्योंकि 'content_type'' fs.files' संरचना का हिस्सा है, लेकिन इसका एक अलग नाम है। – mnemosyn

6

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 
} 

तो कुछ भी आप मेटाडाटा में चाहते हैं की दुकान और सामान्य रूप से पूछें जैसे आप मोंगोडीबी में करेंगे:

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

मैं जानता हूँ कि प्रश्न मेटाडाटा के लिए क्वेरी के जावा तरीके के बारे में पूछना नहीं है, लेकिन यहाँ यह है कि आप एक मेटाडाटा क्षेत्र के रूप में 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()); 
} 
+0

अंगूठे क्यों नीचे? – javaauthority

संबंधित मुद्दे