MongoDB-এ বড় পরিমাণে লেখা (write) অপারেশন দক্ষতার সাথে এক্সিকিউট করার জন্য Ordered Bulk Operations (initializeOrderedBulkOp()) ব্যবহার করা হয়। এটি অর্ডার্ড (ordered) বা আনঅর্ডার্ড (unordered) বাল্ক লিখন অপারেশন বিল্ড করতে সাহায্য করে।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo550.insertOne({
"Name": "Chris",
"details": [
{ "Marks": 49, "Result": "fail" },
{ "Marks": 58, "Result": "fail" }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8e35bd9e5f92834d7f05e4") }
সব ডকুমেন্ট দেখানো
>> db.demo550.find();
আউটপুট:
{ "_id" : ObjectId("5e8e35bd9e5f92834d7f05e4"), "Name" : "Chris", "details" : [
{ "Marks" : 49, "Result" : "fail" },
{ "Marks" : 58, "Result" : "fail" }
] }
বাল্ক অপারেশন দিয়ে "fail" কে "PASS" এ আপডেট করা
> var all = db.demo550.initializeOrderedBulkOp(),
itr = 0;
> db.demo550.find({ "Name": "Chris", "details.Result": "fail" }).forEach(function(doc) {
doc.details.filter(function(d) { return d.Result == "fail" }).forEach(function(d) {
all.find({ "_id": doc._id, "details.Result": "fail" }).updateOne({
"$set": { "details.$.Result": "PASS" }
});
itr++;
if (itr % 10 == 0) {
all.execute();
all = db.demo550.initializeOrderedBulkOp();
}
});
if (itr % 10 != 0)
all.execute();
});
কোড ব্যাখ্যা
initializeOrderedBulkOp()— অর্ডার্ড বাল্ক অপারেশন বিল্ডার তৈরি করে।find(...).forEach(...)— শর্তানুসারী ডকুমেন্টে ইটারেট (iterate) করে।doc.details.filter(...)— ক্লায়েন্ট-সাইডে (mongo shell-এ) অ্যারে ফিল্টার করে "fail" वाले এলিমেন্টগুলো বের করে।all.find(...).updateOne(...)— বাল্কে আপডেট অপারেশন কিউ (queue) করে।details.$.Resultপজিশনাল $ দিয়ে ম্যাচ হওয়া এলিমেন্ট আপডেট করে।itr % 10 == 0— প্রতি ১০টি অপারেশনের পরexecute()কল করে ব্যাচে এক্সিকিউট করে (মেমরি বাঁচাতে)।- শেষে বাকি অপারেশন
execute()দিয়ে রান করা হয়।
আউটপুট
{ "_id" : ObjectId("5e8e35bd9e5f92834d7f05e4"), "Name" : "Chris", "details" : [
{ "Marks" : 49, "Result" : "PASS" },
{ "Marks" : 58, "Result" : "PASS" }
] }
মূল পয়েন্টসমূহ
- Ordered Bulk: অপারেশনগুলো ক্রমাগত এক্সিকিউট হয়; একটা ফেইল করলে বাকিগুলো রুকায়।
- Unordered Bulk:
initializeUnorderedBulkOp()— প্যারালাল এক্সিকিউশন, দ্রুত, অর্ডার গ্যারান্টি নেই। - বাল্ক অপারেশন নেটওয়ার্ক রাউন্ড-ট্রিপ কমায় এবং থ্রুপুট বাড়ায়।
- মডার্ন MongoDB (3.2+) এ
bulkWrite()মেথড ব্যবহার করা বেস্ট প্র্যাকটিস (বা ড্রাইভার-স্পেসিফিক বাল্ক API)। - সতর্কতা: উদাহরণের কোডে
d.Result = "fail"(অ্যাসাইনমেন্ট) ব্যবহার করা হয়েছে==(কমপ্যারিজন) বদলে — এটি বাগ। সঠিক:d.Result == "fail"।