यह बहुत संभव है कि ग्रिडएफएस का उपयोग करके मोंगो में डेटा संग्रहीत करने के लायक नहीं है।
बाइनरी डेटा वास्तव में किसी डेटाबेस से संबंधित नहीं होता है, लेकिन यदि डेटा छोटा है, तो इसे डेटाबेस में डालने का लाभ (क्वेरी करने की क्षमता) कमियों (सर्वर लोड, धीमा) से अधिक है।
इस मामले में, ऐसा लगता है कि आप दस्तावेज़ डेटा (JSON) को GridFS में संग्रहीत करना चाहते हैं। आप ऐसा कर सकते हैं, और इसे वैसे ही स्टोर कर सकते हैं जैसे आप किसी अन्य बाइनरी डेटा को स्टोर करेंगे। हालाँकि, डेटा अपारदर्शी होगा। आप ग्रिडएफएस दस्तावेज़ में संग्रहीत JSON डेटा को क्वेरी नहीं कर सकते, केवल फ़ाइल मेटाडेटा।
बड़ा डेटा क्वेरी करना
जैसा कि आपने उल्लेख किया है कि आप डेटा को क्वेरी करना चाहते हैं, आपको अपने डेटा के प्रारूप की जांच करनी चाहिए। यदि आपका डेटा उदाहरण में सूचीबद्ध प्रारूप में है, तो ऐसा लगता है कि जटिल प्रश्नों की कोई आवश्यकता नहीं है, केवल स्ट्रिंग मिलान है। तो कई विकल्प हैं।
केस 1:बड़ा डेटा, कुछ बिंदु
यदि आपके पास बहुत से डेटा सेट नहीं हैं (field1
. के जोड़े) और field2
) लेकिन प्रत्येक के लिए डेटा बड़ा है (field2
कई बाइट्स होते हैं), इन्हें कहीं और स्टोर करें और केवल उसी के संदर्भ में स्टोर करें। डेटा को स्टोर करना एक आसान समाधान होगा (पूर्व में field2
) Amazon S3 पर एक टेक्स्ट फ़ाइल में स्टोर करें और फिर लिंक को स्टोर करें। उदा.
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
केस 2:छोटा डेटा, कई बिंदु
यदि आपका प्रत्येक डेटा सेट छोटा है (16 एमबी से कम) लेकिन कई डेटा सेट हैं, तो अपना डेटा MongoDB (ग्रिडएफएस के बिना) में स्टोर करें।
विशिष्टता
आपके मामले में, डेटा काफी बड़ा है और इसे ग्रिडएफएस का उपयोग करके संग्रहीत करना अनुचित है।
यह जवाब नीचे की ओर एक बेंचमार्क प्रदान करता है। बेंचमार्क इंगित करता है कि पुनर्प्राप्ति समय फ़ाइल आकार के लिए कमोबेश सीधे आनुपातिक है। उसी सेटअप के साथ, डेटाबेस से एक दस्तावेज़ को पुनः प्राप्त करने में 80 सेकंड का समय लगेगा।
संभावित अनुकूलन
GridFS में डिफॉल्ट चंक साइज 255 KiB है। आप चंक आकार को अधिकतम (16 एमबी) तक बढ़ाकर बड़ी फ़ाइल एक्सेस समय को कम करने में सक्षम हो सकते हैं। यदि चंक आकार ही एकमात्र अड़चन है, तो 16 एमबी चंक आकार का उपयोग करने से पुनर्प्राप्ति समय 80 सेकंड से कम होकर 1.3 सेकंड (80 / (16MB/255KiB) =1.3) हो जाएगा। GridFS बकेट को इनिशियलाइज़ करते समय आप ऐसा कर सकते हैं।
new GridFSBucket(db, {chunkSizeBytes: 16000000})
एक बेहतर रणनीति यह होगी कि मोंगो में एकमात्र फ़ाइल नाम को स्टोर किया जाए और इसके बजाय फाइल सिस्टम से फाइल को पुनः प्राप्त किया जाए।
अन्य कमियां
Mongo में बाइनरी डेटा स्टोर करने का एक और संभावित दोष यह साइट :"यदि बाइनरी डेटा बड़ा है, तो बाइनरी डेटा को मेमोरी में लोड करने से बार-बार एक्सेस किए गए टेक्स्ट (स्ट्रक्चर्ड डेटा) दस्तावेज़ मेमोरी से बाहर हो सकते हैं, या अधिक सामान्यतः, वर्किंग सेट रैम में फिट नहीं हो सकता है। यह नकारात्मक प्रभाव डाल सकता है डेटाबेस का प्रदर्शन।" [1 ]
उदाहरण
Mongo GridFS ट्यूटोरियल से अनुकूलित, GridFS में फ़ाइल सहेजना
const uri = 'mongodb://localhost:27017/test';
mongodb.MongoClient.connect(uri, (error, db) => {
const bucket = new mongodb.GridFSBucket(db);
fs.createReadStream('./fasta-data.json')
.pipe(bucket.openUploadStream('fasta-data.json'))
.on('finish', () => console.log('done!'))
;
});