2011-03-16 6 views
47

मोंगोडीबी में पूछताछ में अधिकतम $ पैरामीटर पास किए गए पैरामीटर क्या हैं?

+0

मैंने कहीं पढ़ा है कि यह 1 000 000 है। – oyatek

+0

दिखाए गए काम के साथ वास्तविक गणना के लिए नीचे देखें। मजेदार प्रयोगों के लिए –

उत्तर

33

ऐसा लगता है कि कोई सीमा नहीं है।

मैंने एक छोटा परीक्षण किया।

1) संग्रह एक था - 1 मिलियन सरल JSON ऑब्जेक्ट {आईडी:, नाम:}

2) संग्रह बी में, मैं संग्रह एक की संदर्भ आईडी भरी हुई है जब तक मैं निम्नलिखित अपवाद हो गया। मैं अधिकतम 450k की संदर्भ संख्या डाल सकता हूं।

Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216 

3) मैं [ID1 ... id450000] में $ के रूप में इन आईडी के 450k भेजने के लिए और संग्रह ए में 1 मिलियन वस्तुओं से 450k आईडी की पूरी सूची खींच

वाह सकता है! यह मेरे आवेदन के लिए पर्याप्त से अधिक है: डी। MongoDB वास्तव में अच्छा है।

+3

+1 – Danimal

6

मुझे लगता है कि सीमा बस बीएसओएनडी दस्तावेज़ के आकार से निर्धारित होती है। जब आप किसी क्वेरी को परिभाषित करते हैं, तो आप मान को अधिकतम $ आकार में तब तक जोड़ सकते हैं जब तक कि आप अधिकतम दस्तावेज़ आकार से अधिक न हो जाएं। तो खंड में आपके पास कितने मूल्य हो सकते हैं इस पर निर्भर करता है कि प्रत्येक मान कितना बड़ा होता है (प्रत्येक मान का आकार छोटा होता है, जितना अधिक आप क्लॉज में $ शामिल कर सकते हैं)।

प्रदर्शन के संदर्भ में, जो मैंने पाया है, उससे खंड में $ में मूल्यों की संख्या के लिए "मीठा स्थान" है। इस संबंधित प्रश्न में मेरा उत्तर देखें: Is it OK to query a MongoDB multiple times per request?

यानी खंड में बनाम प्रश्नों की संख्या बनाम $ में मूल्यों की संख्या को संतुलित करना। मैं उस पर एक ब्लॉग पोस्ट के माध्यम से मध्य मार्ग हूं और अधिक विस्तार से कोशिश करने और गोता लगाने के लिए।

53

क्वेरी स्वयं एक दस्तावेज़ है। MongoDB दस्तावेज़ आकार (संस्करण 2.4.0+ के रूप में) 16 एमबी तक सीमित करता है।

वास्तव में, क्या आप एक खोज के साथ क्या कर रहे हैं:

{ 'fieldOne' : { $in : [ 1, 2, 3, 4] } } 

आप एक करने के लिए पारित कर सकते हैं मूल्यों की अधिकतम संख्या ढूंढने के लिए:

db.collectionName.find(queryDoc) 

जहां 'queryDoc' कुछ की तरह है $ क्वेरी में, bsonsize आदेश का उपयोग करें:

mongos> Object.bsonsize([1]) 
16 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4] } }) 
74 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5] } }) 
85 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6] } }) 
96 

तो, आप देख सकते हैं कि प्रत्येक अतिरिक्त पूर्णांक आकार 11 बाइट है। 11 बिट्स नहीं, 11 BYTES। यह इस तरह से है कि बीएसओएन आंतरिक रूप से कम से कम 64 बिट्स के साथ-साथ रैपर के रूप में संख्याओं को स्टोर करता है। इसे आसानी से देखा जा सकता है:

mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 690000000000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000000000] } }) 
107 
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000000000] } }) 
107 

तो, कोई फर्क नहीं पड़ता कि किसी व्यक्तिगत संख्या का आकार क्या है, यह वही बोनसनाइज है।

प्रश्न पर स्वयं: वह प्रश्न दस्तावेज़ कितना बड़ा है?

इन ऊपर खंड में एक $ के साथ एक क्षेत्र क्वेरी के लिए, pymongo में, mongos जावास्क्रिप्ट शीघ्र, जो कुछ भी है, सब क्वेरी में एक $ का अधिकतम आकार के लिए एक ही इसके तथ्यों उपज के माध्यम से जोड़ा जा रहा है:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }}) 
34 
mongos> Object.bsonsize({ '' : { '$in' : [1] }}) 
33 
mongos> Object.bsonsize({ '' : { '$in' : [] }}) 
22 
  • क्वेरी दस्तावेज़ स्वयं 22 बाइट्स है;
  • फ़ील्ड नाम के प्रत्येक बाइट एक बाइट जोड़ता है;
  • क्लॉज में $ में जोड़े गए प्रत्येक नंबर में 11 बाइट जोड़े गए हैं।

तो, आप यह मानकर एक एक बाइट FIELDNAME (कम से कम, वास्तव में) हैं तो आपका अधिकतम है:

mongos> 16*1024*1024 
16777216 
mongos> (16*1024*1024) - 22 - 1 
16777193 
mongos> ((16*1024*1024) - 22 -1)/11 
1525199.3636363635 

उत्तर: (।। यही कारण है कि 15 लाख है यही कारण है कि बहुत बड़ी है) 1,525,198

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