MongoDB-এ জটিল শর্তাবলীতে অ্যারে এলিমেন্ট ইনসার্ট বা আপডেট করতে bulkWrite() মেথড ব্যবহার করা হয়। এটি একসাথে একাধিক অপারেশন (updateOne, updateMany, insertOne, deleteOne, deleteMany, replaceOne) এক্সিকিউট করতে দেয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo105.insertOne({
... _id: '101',
... Name: 'Chris',
... Details: [
... { Marks1: 60, Marks2: 70, Marks3: 70 },
... { Marks1: 70, Marks2: 70, Marks3: 90 }
... ]
... });
{ "acknowledged" : true, "insertedId" : "101" }
সব ডকুমেন্ট দেখানো
> db.demo105.find().pretty();
আউটপুট:
{ "_id" : "101", "Name" : "Chris", "Details" : [ { "Marks1" : 60, "Marks2" : 70, "Marks3" : 70 }, { "Marks1" : 70, "Marks2" : 70, "Marks3" : 90 } ] }
bulkWrite() দিয়ে জটিল আপডেট/ইনসার্ট
৩টি অপারেশন সিরিয়ালে:
- Marks2=70 এবং Marks3=70 মিলে যাওয়া এলিমেন্টের Marks3 ৯৬ আপডেট
- উপরোক্ত শর্ত নয় এমন এলিমেন্ট থাকলে নতুন এলিমেন্ট পুশ
- আপসার্ট (upsert) - ডকুমেন্ট না থাকলে ইনসার্ট
> db.demo105.bulkWrite([
... { "updateOne": {
... "filter": {
... "_id": "101",
... "Details": { "$elemMatch": { Marks2: 70, Marks3: 70 } }
... },
... "update": { "$set": { "Details.$.Marks3": 96 } }
... }},
... { "updateOne": {
... "filter": {
... "_id": "101",
... "Details": { "$not": { "$elemMatch": { Marks2: 70, Marks3: 70 } } }
... },
... "update": { "$push": { "Details": { Marks1: 94, Marks2: 97, Marks3: 99 } } }
... }},
... { "updateOne": {
... "filter": { "_id": 101 },
... "update": { "$setOnInsert": { "Details": [ { Marks1: 34, Marks2: 67, Marks3: 87 } ] } },
... "upsert": true
... }}
... ]);
ফলাফল
{ "acknowledged" : true, "deletedCount" : 0, "insertedCount" : 0, "matchedCount" : 2, "upsertedCount" : 1, "insertedIds" : {}, "upsertedIds" : { "2" : 101 } }
অপারেশন পর ডকুমেন্ট দেখানো
> db.demo105.find().pretty();
আউটপুট (দুই ডকুমেন্ট তৈরি হয়েছে - আপসার্টের কারণে):
{ "_id" : "101", "Name" : "Chris", "Details" : [ { "Marks1" : 60, "Marks2" : 70, "Marks3" : 96 }, { "Marks1" : 70, "Marks2" : 70, "Marks3" : 90 }, { "Marks1" : 94, "Marks2" : 97, "Marks3" : 99 } ] }
{ "_id" : 101, "Details" : [ { "Marks1" : 34, "Marks2" : 67, "Marks3" : 87 } ] }
গুরুত্বপূর্ণ নোট:
bulkWrite()অ্যারে আকারে অপারেশন নেয়, প্রতিটিতেupdateOne,updateMany,insertOne,deleteOne,deleteMany,replaceOneথাকতে পারেordered: true(ডিফল্ট) - সিরিয়াল এক্সিকিউশন, প্রথম এরর হলে রুক जायेगाordered: false- প্যারালেল এক্সিকিউশন, এরর হলে বাকিগুলো চলবে$setOnInsert- শুধু আপসার্টের সময় (নতুন ডকুমেন্ট তৈরি হলে) প্রয়োগ হয়
সতর্কতা: উদাহরণে _id: "101" (স্ট্রিং) এবং _id: 101 (নাম্বার) দুটি আলাদা মান হিসেবে বিবেচিত হয়েছে, ফলে আপসার্টে নতুন ডকুমেন্ট তৈরি হয়েছে। টাইপ কনসিস্টেন্সি রক্ষা করুন।