MongoDB BSON दस्तावेज़ आकार सीमा को समझना


153

MongoDB से निश्चित गाइड:

4MB (BSON में परिवर्तित होने पर) से बड़े दस्तावेज़ डेटाबेस में सहेजे नहीं जा सकते। यह कुछ हद तक मनमानी सीमा है (और भविष्य में इसे उठाया जा सकता है); यह ज्यादातर खराब स्कीमा डिज़ाइन को रोकने और लगातार प्रदर्शन सुनिश्चित करने के लिए है।

मुझे यह सीमा समझ में नहीं आती है, क्या इसका मतलब यह है कि एक दस्तावेज़ जिसमें बहुत सारी टिप्पणियों के साथ एक ब्लॉग पोस्ट है जो सिर्फ इतना होता है कि 4 एमबी से बड़ा होना एक दस्तावेज के रूप में संग्रहीत नहीं किया जा सकता है?

इसके अलावा यह नेस्टेड दस्तावेजों को भी गिनता है?

क्या होगा अगर मैं एक दस्तावेज चाहता था जो परिवर्तनों को एक मूल्य पर ऑडिट करता है। (यह अंततः 4 एमबी की सीमा से अधिक हो सकता है।)

आशा है कि कोई इसे सही ढंग से समझाता है।

मैंने अभी MongoDB (पहला nosql डेटाबेस जो मैं सीख रहा हूँ) के बारे में पढ़ना शुरू किया है।

धन्यवाद।


5
मुझे लगता है कि प्रश्न को स्पष्ट करना चाहिए कि यह MongoDB संग्रहीत दस्तावेज़ आकारों की एक सीमा है और बीएसओएन प्रारूप की नहीं है।
एलेक्सपोस्कोस्क

2
हालाँकि, मैंने केवल एक विशाल दस्तावेज़ को सहेजने की कोशिश की है जो संदेश प्राप्त करने के लिए सबसे निश्चित रूप से 4MB से अधिक है "BSON :: InvalidDocument: दस्तावेज़ बहुत बड़ा: BSON दस्तावेज़ 4194304 बाइट्स तक सीमित हैं।" अगर ऐसा है, तो क्या यह चेतावनी / त्रुटि संदेश में भ्रामक नहीं है?
निक सो

18
आप आसानी से शेल db.isMaster().maxBsonObjectSize/(1024*1024)+' MB'में कमांड के साथ अपने अधिकतम BSON दस्तावेज़ आकार पा सकते हैं mongo
अहमेतब -

5
स्कीमालेस नोस्कल का उद्देश्य क्या है जहां आप 16 एमबी से अधिक रिकॉर्ड डंप नहीं कर सकते हैं और इसके शीर्ष पर क्रूड ऑपरेशन बनाया है!
रिजवान पटेल

मुझे लगता है कि शुरुआती बोली यह सब कहती है ... खराब स्कीमा डिज़ाइन को रोकने के लिए सीमा लागू है। यदि, उदाहरण के लिए, आपके पास कई टिप्पणियों के साथ एक पोस्ट है, तो आप एक ब्लॉग प्रविष्टि संग्रह और एक टिप्पणी संग्रह या एक परिवर्तन संग्रह चाहते हैं। मोंगो / नोसक्ल का डिज़ाइन दस्तावेज़ों के नेटवर्क के रूप में बड़े पैमाने पर आकार देने की अनुमति देता है, लेकिन डेवलपर को उन भागों में तोड़ने की ज़रूरत है जो समझ में आते हैं। यदि कोई आकार सीमा निर्धारित नहीं है, तो अन्य समस्याएं होंगी। मुझे लगता है कि 4mb की सीमा ठीक थी। 16mb, महान! लेकिन अगर मैं 16mb का दस्तावेज़ लिख रहा हूँ, तो यह एक संकेत है कि डिज़ाइन में कुछ और गलत है।
बरौनी

जवाबों:


126

सबसे पहले, यह वास्तव में अगले संस्करण में उठाया जा रहा है 8MBया 16MB... लेकिन मुझे लगता है कि इसे परिप्रेक्ष्य में रखना है, 10gen (जो MongoDB विकसित) से एलियट इसे सबसे अच्छा डालता है:

EDIT: आकार को आधिकारिक तौर पर 'बढ़ा' दिया गया है16MB

तो, आपके ब्लॉग उदाहरण पर, 4MB वास्तव में एक बहुत कुछ है। उदाहरण के लिए, "वार ऑफ़ द वर्ल्ड्स" का पूरा अनकम्प्रेस्ड टेक्स्ट केवल 364k (html) है: http://www.gutenberg.org/etext/36

यदि आपका ब्लॉग पोस्ट उस लंबी टिप्पणी के साथ लंबा है, तो मैं एक के लिए इसे पढ़ने नहीं जा रहा हूं :)

Trackbacks के लिए, यदि आप उन्हें 1MB समर्पित करते हैं, तो आप आसानी से 10k (शायद 20k के करीब) से अधिक हो सकते हैं

तो वास्तव में विचित्र स्थितियों को छोड़कर, यह बहुत अच्छा काम करेगा। और अपवाद मामले या स्पैम में, मुझे नहीं लगता कि आप किसी भी तरह 20mb का ऑब्जेक्ट चाहते हैं। मुझे लगता है कि 15k के रूप में ट्रैकबैक कैपिंग या प्रदर्शन के लिए बहुत मायने रखता है। या कम से कम विशेष आवरण यदि ऐसा होता है।

-Eliot

मुझे लगता है कि आप सीमा तक पहुंचने के लिए बहुत कठिन हो सकते हैं ... और समय के साथ, अगर आप अपग्रेड करते हैं ... तो आपको कम और कम चिंता करनी होगी।

सीमा का मुख्य बिंदु यह है कि आप अपने सर्वर पर सभी रैम का उपयोग न करें ( MBजब आप क्वेरी करते हैं तो आपको दस्तावेज़ के सभी एस को रैम में लोड करने की आवश्यकता होती है।)

तो सीमा एक सामान्य प्रणाली पर सामान्य प्रयोग करने योग्य रैम का कुछ% है ... जो साल-दर-साल बढ़ती रहेगी।

MongoDB में भंडारण फ़ाइलों पर ध्यान दें

यदि आपको दस्तावेज़ों (या फ़ाइलों) को स्टोर करने की आवश्यकता होती है, तो 16MBआप ग्रिफ़्फ़्स एपीआई का उपयोग कर सकते हैं जो डेटा को खंडों में स्वचालित रूप से तोड़ देगा और उन्हें आपके पास वापस भेज देगा (इस प्रकार आकार सीमा / रैम के साथ समस्या से बचता है ।)

किसी एकल दस्तावेज़ में किसी फ़ाइल को संग्रहीत करने के बजाय, GridFS फ़ाइल को भागों में विभाजित करता है, या विखंडू करता है, और प्रत्येक चंक को एक अलग दस्तावेज़ के रूप में संग्रहीत करता है।

GridFS फ़ाइलों को संग्रहीत करने के लिए दो संग्रह का उपयोग करता है। एक संग्रह फ़ाइल विखंडन को संग्रहीत करता है, और अन्य संग्रह मेटाडेटा को फ़ाइल करते हैं।

आप इस विधि का उपयोग डेटाबेस में छवियों, फ़ाइलों, वीडियो आदि को स्टोर करने के लिए कर सकते हैं जितना कि आप किसी SQL डेटाबेस में कर सकते हैं। मैं भी बहु गीगाबाइट वीडियो फ़ाइलों को स्टोर करने के लिए इसका इस्तेमाल किया है।


2
यह भयानक है कि आपके पास अपने पूरे डेटाबेस के लिए पर्याप्त रैम है ... आमतौर पर "वर्किंग सेट" रैम में होता है, पूरे डेटाबेस में नहीं (जैसे मेरे मामले में मेरे पास एक से अधिक x जीबीएस डेटाबेस है जहां अगर सभी जोड़े गए तो मेरी रैम से अधिक होगी। लेकिन यह ठीक है क्योंकि काम करने का सेट बहुत छोटा है, बहुत छोटा है।) इसके अलावा, अगर कोई सीमा नहीं थी तो आप एक 800MB डॉक को RAM w / एक क्वेरी में लोड कर सकते हैं और दूसरे के साथ एक 400k डॉक्टर, जिससे आपकी RAM थोड़ी मुश्किल हो सकती है, और आदि। तो "सीमा" कुछ विशिष्ट सर्वर रैम का% है (इस प्रकार यह समय के साथ बढ़ता है।) mongodb.org/display/DOCS/Checking+Server+Memory+Usage
जस्टिन जेनकिंस

3
यह बहुत अच्छा है कि आप सब कुछ रैम में स्टोर कर सकते हैं, लेकिन दक्षता और ब्लॉग पोस्ट मुहावरा पर विचार करें। आप स्पष्ट रूप से एक पोस्ट चाहते हैं कि अगर यह पढ़ा जाए तो स्मृति में हो। लेकिन क्या आप वास्तव में चाहते हैं कि किसी ब्लॉग पोस्ट के लिए 10 पेज की टिप्पणियां स्मृति में हों जब ज्यादातर लोग पहले पृष्ठ को कभी नहीं पढ़ेंगे? ज़रूर, आप इसे कर सकते हैं और यदि आपका डेटाबेस इतना छोटा है कि यह सभी मेमोरी में फिट हो सकता है, तो कोई समस्या नहीं है। लेकिन शुद्ध दक्षता के मामले में, आप बेकार बिट्स को मेमोरी स्पेस लेने के लिए नहीं चाहते हैं यदि आप इससे बच सकते हैं (और यह आरडीबीएमएस के लिए भी जाता है)।
एलेक्सगैड

50
स्वीट जीसस, तो मोंगो का तर्क है "16 एमबी किसी के लिए पर्याप्त होना चाहिए"? ऐसा नहीं है कि अतीत में कभी भी गलत साबित हुआ है।
रॉबर्ट क्राइस्ट

2
यह मेरे लिए बहुत बुरा लगता है। मानगो को बड़े डेटा के लिए उपयोगी माना जाता है, ऐसी सीमाएं नहीं हैं। मेरी परियोजना में, मुझे एक ही ट्रेंडिंग टॉपिक से संबंधित और सामूहिक ट्वीट करने की आवश्यकता है, और यह 20 घंटे की समयावधि के लिए 20000 से अधिक ट्वीट्स में समाप्त हो सकता है (और यह बहुत संभव है कि ट्रेंड्स से अधिक ड्यूरेटिंग हो जाएगा मेरे db में 20 घंटे)। एक ही समय में कई ट्वीट और उनके पाठ को स्टोर करना विनाशकारी है और कुछ छोटे रुझानों के समूह के बाद, यह एक बड़ी प्रवृत्ति पर अपवाद के साथ समाप्त होता है।
सवास्वस परस्तातिदिस

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

32

समुदाय के कई लोग प्रदर्शन के बारे में चेतावनी के साथ कोई सीमा नहीं पसंद करते हैं, इस टिप्पणी को एक उचित तर्क के लिए देखें: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin। system.issuetabpanels: टिप्पणी-tabpanel # टिप्पणी-22,283

मेरा लेना, मुख्य डेवलपर्स इस मुद्दे के बारे में जिद्दी हैं क्योंकि उन्होंने फैसला किया कि यह एक महत्वपूर्ण "फीचर" था। वे जल्द ही इसे बदलने नहीं जा रहे हैं क्योंकि उनकी भावनाओं को चोट लगी है कि किसी ने भी इस पर सवाल उठाया। खुले स्रोत समुदायों में एक उत्पाद से व्यक्तित्व और राजनीति का एक और उदाहरण है, लेकिन यह वास्तव में एक अपंग मुद्दा नहीं है।


5
मैं आपके साथ पूरी तरह से सहमत हूं, यह अब एम्बेडेड दस्तावेज़ों के उद्देश्य को भी हरा देता है, क्योंकि अधिकांश एम्बेडेड दस्तावेज़ अब आसानी से सीमा पार कर जाएंगे। उनके अंदर दस्तावेजों की सरणी के साथ Esp
शारजील अहमद

@ marr75 यह कहता है कि अब तय हो गया है, क्या यह तय हो गया है?
माफिया

1
मेरा मतलब है, सीमा को 16 एमबी तक बढ़ा दिया गया था, जो कि "मुद्दा" दीर्घकालिक को ठीक नहीं करता है; IMO की सीमा को समाप्त किया जाना चाहिए।
18

2
6 साल पुराना धागा नेक्रो। मैं आपके विशिष्ट खराब उपयोग के मामले / डिजाइन उदाहरण से दृढ़ता से सहमत नहीं हूं। इसके अलावा, उदाहरण उदाहरण के लिए बहुत बेहतर है कि आपको एक एकल दस्तावेज़ आकार सीमा की तुलना में इनपुट को मान्य करने की आवश्यकता क्यों है। एप्लिकेशन को अपने नेस्टेड दस्तावेज़ों को अलग-अलग दस्तावेज़ों के रूप में दूसरे संग्रह में विभाजित करना या एक नया "निरंतरता" दस्तावेज़ शुरू करना (समाधान मैंने इस सीमा के भीतर काम करने के लिए कई बार उपयोग किया है) प्रदर्शन पर बहुत कम प्रभाव पड़ा लेकिन कोड जटिलता पर बड़ा प्रभाव। दस्तावेज़ DBs का संपूर्ण बिंदु डेटा स्थानीयता है।
मार्रा 75

4
एक ही गणित के बारे में करने के लिए धन्यवाद mongoDB दस्तावेज़ इस निर्णय का बचाव करने के लिए करते हैं, लेकिन आपका एकल उपयोग मामला और सोचा प्रयोग निर्णायक से दूर है। मुझे इस तथ्य को हल करने के लिए जटिल, निरर्थक डिजाइनों के साथ आना पड़ा है कि एक मनमानी सीमा है जो मोंगो (गहरी नेस्टेड या डुप्लिकेट प्रविष्टियों के बिना, बीटीडब्ल्यू) द्वारा हिट हो जाती है। आपके तर्क से, किसी भी डेटाबेस को 16MB से अधिक कुल सम्‍मिलित करने की आवश्‍यकता नहीं है क्‍योंकि कुछ मनमाने पाठों को कम संग्रहण का उपयोग करके दर्शाया जा सकता है। यह स्पष्ट रूप से मूर्खतापूर्ण है।
५75

31

उन लोगों के लिए यहां एक स्पष्टीकरण उत्तर पोस्ट करने के लिए जो Google द्वारा निर्देशित किए गए हैं।

दस्तावेज़ के आकार में दस्तावेज़ में सब कुछ शामिल है, जिसमें उपनिर्देशिका, नेस्टेड ऑब्जेक्ट आदि शामिल हैं।

तो एक दस्तावेज:

{
    _id:{},
    na: [1,2,3],
    naa: [
        {w:1,v:2,b:[1,2,3]},
        {w:5,b:2,h:[{d:5,g:7},{}]}
    ]
}

अधिकतम 16meg का आकार है।

Sbudocuments और नेस्टेड ऑब्जेक्ट्स को दस्तावेज़ के आकार की ओर गिना जाता है।


विडंबना यह है कि सबसे बड़ा संभव ढांचा, जो कि BSON में प्रस्तुत किया जा सकता है, विडंबना यह है कि सबसे कॉम्पैक्ट भी है। इस तथ्य के बावजूद कि MongoDB size_t(64-बिट) सरणी इंडेक्स का आंतरिक रूप से उपयोग करता है , 16MB दस्तावेज़ का आकार सीमा, सबसे अच्छा होगा, एक दस्तावेज़ का प्रतिनिधित्व करने में सक्षम होगा जिसमें दो मिलियन NULLs वाले एकल सरणी शामिल हैं।
अमाकेलॉरर

माफी, पते के लिए दूसरी टिप्पणी जोड़ना / एक और महत्वपूर्ण विवरण को स्पष्ट करना: जब आप कहते हैं कि दस्तावेज़ आकार में दस्तावेज़ में सब कुछ शामिल है , जिसमें कुंजियाँ भी शामिल हैं । जैसे {"f": 1}दो बाइट से छोटा है {"foo": 1}। यदि आप सावधान नहीं हैं तो यह तेजी से जुड़ सकता है, हालांकि आधुनिक ऑन-डिस्क संपीड़न मदद करता है।
शाम

6

मैंने अभी तक सीमा के साथ कोई समस्या नहीं देखी है जिसमें दस्तावेज़ के भीतर संग्रहीत बड़ी फाइलें शामिल नहीं थीं। पहले से ही विभिन्न प्रकार के डेटाबेस हैं जो बड़ी फ़ाइलों को संग्रहीत / पुनर्प्राप्त करने में बहुत कुशल हैं; उन्हें ऑपरेटिंग सिस्टम कहा जाता है। डेटाबेस ऑपरेटिंग सिस्टम पर एक परत के रूप में मौजूद है। यदि आप प्रदर्शन कारणों से NoSQL समाधान का उपयोग कर रहे हैं, तो आप अपने एप्लिकेशन और अपने डेटा के बीच DB परत लगाकर अपने डेटा की पहुंच में अतिरिक्त प्रसंस्करण ओवरहेड क्यों जोड़ना चाहेंगे?

JSON एक टेक्स्ट फॉर्मेट है। इसलिए, यदि आप JSON के माध्यम से अपना डेटा एक्सेस कर रहे हैं, तो यह विशेष रूप से सच है यदि आपके पास बाइनरी फाइलें हैं, क्योंकि उन्हें यूएनकोड, हेक्साडेसिमल या बेस 64 में एन्कोड किया जाना है। रूपांतरण पथ की तरह लग सकता है

बाइनरी फ़ाइल <> JSON (एन्कोडेड) <> BSON (एन्कोडेड)

अपने दस्तावेज़ में डेटा फ़ाइल में पथ (URL) डालना और डेटा को बाइनरी में रखना अधिक कुशल होगा।

यदि आप वास्तव में अज्ञात लंबाई की इन फ़ाइलों को अपने DB में रखना चाहते हैं, तो आप शायद इन्हें ग्रिड्स में डालना बंद कर देंगे और बड़ी फ़ाइलों के एक्सेस होने पर अपनी संगति को नहीं मारेंगे।


1
"पहले से ही विभिन्न प्रकार के डेटाबेस हैं जो बड़ी फ़ाइलों को संग्रहीत / पुनर्प्राप्त करने में बहुत कुशल हैं; उन्हें ऑपरेटिंग सिस्टम कहा जाता है।" ब्लॉग
post/

6

BSON दस्तावेज़ों के लिए नेस्टेड गहराई: MongoDB BSON दस्तावेज़ों के लिए नेस्टिंग के 100 से अधिक स्तरों का समर्थन नहीं करता है।

अधिक जानकारी vist


2

शायद एक ब्लॉग पोस्ट को संग्रहीत करना -> एक गैर-संबंधपरक डेटाबेस में टिप्पणी का संबंध वास्तव में सबसे अच्छा डिजाइन नहीं है।

आपको संभवतः ब्लॉग पोस्ट में एक अलग संग्रह में टिप्पणियों को स्टोर करना चाहिए।

[संपादित करें]

आगे की चर्चा के लिए नीचे टिप्पणी देखें।


15
मैं बिल्कुल सहमत नहीं हूं। आपके ब्लॉग पोस्ट दस्तावेज़ों में टिप्पणियाँ MongoDB में पूरी तरह से ठीक होनी चाहिए ... यह एक बहुत ही सामान्य उपयोग है (मैं इसे उत्पादन में एक से अधिक स्थानों पर उपयोग करता हूं और यह काफी अच्छी तरह से काम करता है।)
जस्टिन जेनकिंस

2
मैं अपने जवाब में शायद सख्त था। MongoDB या इसी तरह के डेटाबेस में ब्लॉग पोस्ट और संबंधित टिप्पणियों को संग्रहीत करने में कुछ भी गलत नहीं है। यह अधिक है कि लोग क्षमताओं पर आधारित उन दस्तावेज़ों को अधिक उपयोग करते हैं जो डेटाबेस देते हैं (सबसे कट्टरपंथी उदाहरण 'ब्लॉग' नामक एक दस्तावेज़ में आपके सभी डेटा को संग्रहीत करना होगा)
Mchl

3
@ एमसीएचएल: "ब्लॉग" अच्छा नहीं है, लेकिन एक अलग संग्रह में टिप्पणियां संग्रहीत करना समान कारणों से उतना ही बुरा है। एक टिप्पणी सरणी के साथ पोस्ट की तरह है, एक दस्तावेज़ के कैनबिकल उदाहरण db।
मैट ब्रिग्स

6
@SoPeople: किसी पोस्ट के भीतर टिप्पणियाँ संग्रहीत करना दस्तावेज़-उन्मुख DBs के कैनोनिकल उदाहरण की तरह है। (एक दस्तावेज़ के अंदर एक विकी पाठ की संपूर्णता को संग्रहीत करने की तरह) अगर मुझे SO लिखना है तो यह पूरी तरह से MongoDB पर चलेगा। इन SO प्रविष्टियों में से कोई भी यथोचित 4MB से अधिक नहीं है। क्रेगलिस्ट अपने इतिहास का एक महान DB प्रवास MongoDB कर रहा है। उनके पास केवल डॉक्स के एक जोड़े की सीमा थी और लीड डेवलपर ने सुझाव दिया था कि डॉक्स स्वयं वास्तव में भंडाफोड़ किया गया था (कुछ बग का परिणाम)। फिर, 4 megs पाठ के कई उपन्यास है।
गेट्स वीपी

3
@ गेट्स वीपी, मैं एक पूर्ण पाठ इंजन का उपयोग करने के बारे में सहमत हूं। मैं मेटाडेटा खोज के बारे में सोच रहा था। क्या होगा यदि आपके पास बुक दस्तावेज़ों का एक सेट है, और आप 1982 में प्रकाशित सभी पुस्तकों को ढूंढना चाहते हैं? यदि प्रत्येक पुस्तक में + 100kb का पाठ है, तो आप पहले 20 पुस्तक शीर्षकों को प्रदर्शित करने के लिए कई मेगाबाइट्स को स्थानांतरित नहीं करना चाहते हैं।
mikerobi

0

Https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-1 के अनुसार

यदि आप उम्मीद करते हैं कि एक ब्लॉग पोस्ट 16Mb दस्तावेज़ सीमा से अधिक हो सकती है, तो आपको टिप्पणियों को एक अलग संग्रह में निकालना चाहिए और टिप्पणी से ब्लॉग पोस्ट का संदर्भ देना चाहिए और आवेदन-स्तर में शामिल होना चाहिए।

// posts
[
  {
    _id: ObjectID('AAAA'),
    text: 'a post',
    ...
  }
]

// comments
[
  {
    text: 'a comment'
    post: ObjectID('AAAA')
  },
  {
    text: 'another comment'
    post: ObjectID('AAAA')
  }
]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.