আগের Query Operators lesson comparison, logical, আর element/existence operator কভার করেছে। এই lesson আরো দুটো category কভার করে: array field-এর ভেতরে match করা, আর exact মানের বদলে pattern দিয়ে text match করা।
একটা document match করে যার array field-এ list করা প্রতিটা মান আছে, যেকোনো ক্রমে — একটা plain array match-এর মতো না, যার পুরো array-র একটা exact match লাগে।
db.products.find({ tags: { $all: ['electronics', 'sale'] } })
// এমন একটা document match করে যার tags array-তে 'electronics' আর 'sale'
// দুটোই আছে, ক্রম বা অন্য tag থাকা নির্বিশেষেএকটা array object ধরে রাখলে দরকার, আর একটা একক element-কে একসাথে বেশ কয়েকটা শর্ত সন্তুষ্ট করতে হয় — এটা ছাড়া, শর্তগুলো প্রতিটা ভিন্ন element-এ মিলতে পারত।
// একটা reviews array সহ একটা product: [{ rating: 5, verified: true }, { rating: 2, verified: false }]
// $elemMatch ছাড়া — যেকোনো review-এর rating 5 আর যেকোনো review verified হলে মেলে,
// একই review না হলেও
db.products.find({ 'reviews.rating': 5, 'reviews.verified': true })
// $elemMatch সহ — দুটো শর্তই পূরণ করা একটা single review দরকার
db.products.find({
reviews: { $elemMatch: { rating: 5, verified: true } }
})db.products.find({ tags: { $size: 3 } })
// শুধু যাদের tags array-তে ঠিক 3টা element আছে সেই document match করে$size-এর কোনো range version নেই
$size শুধু একটা exact দৈর্ঘ্য match করে — "3-এর বেশি"-এর জন্য কোনো built-in $size: { $gt: 3 } নেই। একটা common workaround একটা আলাদা সংরক্ষিত count field, array বদলালে sync রাখা।
আগের JavaScript কোর্স থেকে pattern matching-এর মতোই একটা string field-কে একটা regular expression-এর বিরুদ্ধে match করে।
// "Jo" দিয়ে শুরু হওয়া নাম (case-sensitive)
db.users.find({ name: { $regex: /^Jo/ } })
// Case-insensitive, string-এর যেকোনো জায়গায় match
db.users.find({ name: { $regex: /smith/i } })
// বিকল্প সিনট্যাক্স, pattern একটা variable হলে useful
db.users.find({ name: { $regex: '^Jo', $options: 'i' } })একটা performance note
একটা unanchored $regex (শুরুতে ^ নেই) একটা text index efficiently ব্যবহার করতে পারে না আর প্রতিটা document scan করে — একটা ছোট collection-এ ঠিক আছে, একটা বড়টায় খেয়াল রাখার যোগ্য। একটা dedicated text index (Specialized Indexes lesson-এ কভার করা) বড় স্কেলে text search ভালো handle করে।
| Operator | যা match করে |
|---|---|
| $all | list করা প্রতিটা মান ধারণ করা একটা array |
| $elemMatch | একসাথে একাধিক শর্ত সন্তুষ্ট করা একটা array element |
| $size | ঠিক একটা সংখ্যক element সহ একটা array |
| $regex | একটা pattern-এ মেলা একটা string |