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()
का उपयोग कर का उपयोग कर सकते हैं।
कोई मेटाडेटा फ़ील्ड पर उपयोग करने योग्य अनुक्रमणिका कैसे बनाएगा? –
आप बस {{fs.files.metadata.my_field: 1} जैसे इंडेक्स बना सकते हैं, 'स्कीमा नहीं होने से कुछ चीजों को सरल बनाता है – mnemosyn