मैं इसमें सामान्य चेतावनी के साथ प्रवेश करूंगा कि मैं मानता हूं कि मैंने परिणामों को देखा भी नहीं है, लेकिन मूल सिद्धांत शुरू से ही मुझे मान्य लगते हैं।
आपको सामान्य कॉलों में प्रस्तुत की जाने वाली "अच्छी सिंटैक्स चीनी" के "वास्तव में हुड के नीचे क्या हो रहा है" पर विचार करने की आवश्यकता है। इसका मतलब मूल रूप से यह देख रहा है कि आप जिस ऑपरेशन को कॉल कर रहे हैं उसका "कमांड फॉर्म" वास्तव में क्या करता है। इस मामले में "update" ।
इसलिए, यदि आपने उस लिंक को पहले ही देख लिया है, तो निम्नलिखित "बल्क पर विचार करें। " अद्यतन प्रपत्र:
var bulk = db.collection.initializeOrdedBulkOp();
bulk.find({ "_id": 1 }).updateOne({ "$set": { "a": 1 } });
bulk.find({ "_id": 2 }).updateOne({ "$set": { "b": 2 } });
bulk.execute();
अब आप पहले से ही जानते हैं कि यह सर्वर को एक . के रूप में भेजा जा रहा है अनुरोध, लेकिन आप जिस पर विचार नहीं कर रहे हैं, वह यह है कि "हुड के तहत" किया गया वास्तविक "अनुरोध" वास्तव में यह है:
db.runCommand({
"update": "collection",
"updates": [
{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } },
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
],
"ordered": true
})
इसलिए इसका कारण यह है कि आप वास्तव में "अपडेट" ऑपरेशन के तहत लॉग में जो देखते हैं वह वास्तव में कुछ ऐसा है (पूर्ण आउटपुट से केवल क्वेरी के लिए संक्षिप्त):
{ "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } }
{ "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
इसलिए इसका मतलब है कि संबंधित कमांड के साथ उनमें से प्रत्येक क्रिया प्रतिकृति पर "रीप्ले" के लिए ओप्लॉग में है और/या अन्य कार्रवाइयां जो आप विशेष रूप से ओपलॉग प्रविष्टियों को "रीप्ले" कर सकते हैं।
मुझे यकीन है कि वास्तव में बिना देखे भी ऐसा ही होता है, क्योंकि मुझे पता है कि ड्राइवर वास्तविक कॉल को कैसे लागू करते हैं, और यह समझ में आता है कि प्रत्येक कॉल को इस तरह से ओप्लॉग के भीतर रखा जाता है।
इसलिए "एक पूरे के रूप में", तो नहीं। ये "लेन-देन" नहीं हैं और हमेशा अलग-अलग संचालन होते हैं, भले ही उनका सबमिशन और रिटर्न एक ही अनुरोध के भीतर हो। लेकिन वे नहीं . हैं एक विलक्षण ऑपरेशन, और इसलिए इस तरह से रिकॉर्ड नहीं किया जाएगा और न ही होना चाहिए।