TL; DR:$inc इन-प्लेस अपडेट की गारंटी देता है, $set नहीं, लेकिन बहुत विशिष्ट परिस्थितियों में इसे अपने स्थान पर भी किया जा सकता है।
विवरण
इसके दो पहलू हैं:
-
यह तार के ऊपर कैसे जाता है?
जानकारी एक ऑपरेशन के रूप में भेजी जाती है, एक
$setएक$setरहता है तो यह एक डेल्टा है। प्रतिकृति के लिए उपयोग किए जाने वाले ओप्लॉग के लिए भी यही सच है। इस तरह,$set. का उपयोग करके बैंडविड्थ के संबंध में अधिक कुशल है। -
इसे डिस्क पर कैसे अपडेट किया जाता है?
MongoDB एक इन-प्लेस अपडेट करता है अगर और केवल अगर कुंजी (फ़ील्ड) पहले से मौजूद है , इसलिए जब आप किसी दस्तावेज़ में एक नया फ़ील्ड जोड़ते हैं, तो यह किसी मौजूदा फ़ील्ड को केवल एक भिन्न मान निर्दिष्ट करने की तुलना में एक बड़ा ऑपरेशन होता है।
फिर भी, हालांकि, मानों का समान आकार . होना चाहिए और प्रकार नहीं बदलना चाहिए और वे प्रकार के होने चाहिए
double, long, int or bool, अन्यथा यह नहीं है वर्तमान में एक इन-प्लेस अपडेट।
मुझे यकीन नहीं है कि बाद वाला वास्तव में कैसे महत्वपूर्ण है व्यवहार में , लेकिन सर्वर निश्चित रूप से दोनों के लिए पूरी तरह से अलग कोड पथ का उपयोग करता है, इसलिए यह उदाहरण के लिए फ़ील्ड री-ऑर्डरिंग का कारण बन सकता है। बहुत बड़े दस्तावेज़ों के लिए, जिसके परिणामस्वरूप संभवतः प्रदर्शन में औसत दर्जे का अंतर आएगा।
इससे पता चलता है कि $inc इस मायने में बहुत अलग है कि यह केवल संचालन की अनुमति देता है जो निश्चित रूप से जगह में हैं, क्योंकि $inc केवल संख्यात्मक प्रकारों पर काम करता है और स्वाभाविक रूप से आकार या प्रकार को नहीं बदल सकता है।