MongoDB-এ অ্যারেতে কোনো স্ট্রিং নির্দিষ্ট শব্দের সাবস্ট্রিং (substring) কিনা চেক করতে অ্যাগ্রিগেশন পাইপলাইনে $indexOfBytes, $map, $anyElementTrue ইত্যাদি ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo90.insertOne({ "words": ["john", "jace"] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c1ada79799acab037af56") }
> db.demo90.insertOne({ "words": ["sam", "adam"] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c1adb79799acab037af57") }
সব ডকুমেন্ট দেখানো
>> db.demo90.find();
আউটপুট:
{ "_id" : ObjectId("5e2c1ada79799acab037af56"), "words" : [ "john", "jace" ] }
{ "_id" : ObjectId("5e2c1adb79799acab037af57"), "words" : [ "sam", "adam" ] }
সাবস্ট্রিং মিলিয়ে কোয়ারী
"john" শব্দের সাবস্ট্রিং অ্যারেতে আছে কিনা চেক করা হয়েছে:
> db.demo90.aggregate([
... { $match: { $expr: { $anyElementTrue: { $map: { input: "$words", as: "j", in: { $ne: [ -1, { $indexOfBytes: [ "john", "$$j" ] } ] } } } } } }
... ]);
ফলাফল
{ "_id" : ObjectId("5e2c1ada79799acab037af56"), "words" : [ "john", "jace" ] }
স্টেপ বাই স্টেপ ব্যাখ্যা:
$map-$wordsঅ্যারের প্রতিটি এলিমেন্ট (%%j) এর জন্য কাজ করে$indexOfBytes: ["john", "$$j"]- "john" স্ট্রিং-এ %%j সাবস্ট্রিং খুঁজে, পাওয়া গেলে পজিশন (০ বা অধিক), নাও পাওয়া গেলে -১ রিটার্ন করে$ne: [-1, ...]- ফলাফল -১ নয় কিনা চেক করে (অর্থাৎ পাওয়া গেছে)$anyElementTrue- অ্যারেতে কমপক্ষে একটি true হলে true রিটার্ন করে$matchwith$expr- এক্সপ্রেশন true হলে ডকুমেন্ট রাখে
ফলাফল: প্রথম ডকুমেন্টে "john" এবং "jace" আছে, "john"-এ "john" সাবস্ট্রিং পাওয়া গেলে true। দ্বিতীয় ডকুমেন্টে "sam", "adam" - কোনোটিই "john"-এর সাবস্ট্রিং নয়।
নোট: এটি কেস-সেনসিটিভ। কেস-ইনসেনসিটিভ করতে $toLower বা $regex ব্যবহার করুন। MongoDB 4.2+ এ $function বা $reduce দিয়ে আরও সহজে লেখা যায়।