MongoDB-এ প্রজেকশন ব্যবহার করে নির্দিষ্ট সাব-ডকুমেন্ট রিটার্ন করা
MongoDB-এ অ্যারেতে থাকা নির্দিষ্ট সাব-ডকুমেন্ট (যেমন Name="Sam") শুধু সেটি রিটার্ন করতে find()-এর দ্বিতীয় আর্গুমেন্টে প্রজেকশন অবজেক্ট ব্যবহার করা হয়, যেখানে $ (পজিশনাল অপারেটর) ম্যাচ করা এলিমেন্টকে নির্দেশ করে।
উদাহরণ: ডিটেইলস অ্যারে সহ ডকুমেন্ট তৈরি
> db.demo37.insertOne({"Details":[{"Name":"Chris","Age":21},{"Name":"David","Age":23}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e176635cfb11e5c34d898d7") }
> db.demo37.insertOne({"Details":[{"Name":"Sam","Age":23},{"Name":"Robert","Age":25}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17664acfb11e5c34d898d8") }
সমস্ত ডকুমেন্ট
> db.demo37.find();
{ "_id" : ObjectId("5e176635cfb11e5c34d898d7"), "Details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 23 } ] }
{ "_id" : ObjectId("5e17664acfb11e5c34d898d8"), "Details" : [ { "Name" : "Sam", "Age" : 23 }, { "Name" : "Robert", "Age" : 25 } ] }
নির্দিষ্ট সাব-ডকুমেন্ট (Name="Sam") সিলেক্ট করা
> db.demo37.find({'Details.Name' : 'Sam'},{_id: 0, 'Details.$.Name': 1});
ফলাফল
{ "Details" : [ { "Name" : "Sam", "Age" : 23 } ] }
ব্যাখ্যা
{'Details.Name' : 'Sam'}: কুয়েরি - Details অ্যারেতে Name="Sam" থাকা ডকুমেন্ট খুঁজে।{_id: 0, 'Details.$.Name': 1}: প্রজেকশন - _id বাদ দিয়ে, ম্যাচ করা এলিমেন্টের ($) শুধু Name ফিল্ড দেখাবে।- ফলাফলে Age-ও আসে কারণ
Details.$পুরো এলিমেন্ট রিটার্ন করে; শুধু Name চাইলে'Details.$.Name': 1দিয়ে সম্ভব (যদি শুধু Name থাকে তবে পুরো অবজেক্ট আসে) - MongoDB-এ প্রজেকশনে নেস্টেড ফিল্ড এক্সক্লুড করা জটিল।
সীমাবদ্ধতা
$শুধু প্রথম ম্যাচ করা এলিমেন্ট রিটার্ন করে।- একাধিক ম্যাচ করলে সবগুলো পেতে
$elemMatchপ্রজেকশনে ব্যবহার করুন। - অগ্রেশন পাইপলাইন (
$filter,$arrayElemAt) আরও শক্তিশালী।