MongoDB-এ গভীর নেস্টেড (nested) JSON অবজেক্ট থেকে নির্দিষ্ট ডেটা মাত্র ফেচ করতে findOne() মেথডে প্রজেকশন এবং $elemMatch ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo109.insertOne({
... "Name" : "Chris",
... "Subjects" : [
... {
... "Id" : "100",
... "Name": "MySQL",
... "InstructorDetails" : [
... { "Name" : "John" }
... ]
... },
... {
... "Id" : "101",
... "Name": "MongoDB",
... "InstructorDetails" : [
... { "Name" : "Mike" }
... ]
... }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ee7df9fd5fd66da21447a") }
সব ডকুমেন্ট দেখানো
>> db.demo109.find();
আউটপুট:
{ "_id" : ObjectId("5e2ee7df9fd5fd66da21447a"), "Name" : "Chris", "Subjects" : [ { "Id" : "100", "Name" : "MySQL", "InstructorDetails" : [ { "Name" : "John" } ] }, { "Id" : "101", "Name" : "MongoDB", "InstructorDetails" : [ { "Name" : "Mike" } ] } ] }
নেস্টেড JSON অবজেক্টের ডেটা মাত্র পাওয়ার কোয়ারী
findOne() মেথডে কোয়ারী, প্রজেকশন এবং কলব্যাক ফাংশন ব্যবহার করা হয়েছে:
> db.demo109.findOne(
... { Name: "Chris" },
... { 'Subjects': { $elemMatch: { 'Id': "100" } } },
... function (err, doc) { console.log(doc) }
... );
ফলাফল
{ "_id" : ObjectId("5e2ee7df9fd5fd66da21447a"), "Subjects" : [ { "Id" : "100", "Name" : "MySQL", "InstructorDetails" : [ { "Name" : "John" } ] } ] }
ব্যাখ্যা:
- প্রথম আর্গুমেন্ট:
{ Name: "Chris" }- ডকুমেন্ট ফিল্টার - দ্বিতীয় আর্গুমেন্ট:
{ 'Subjects': { $elemMatch: { 'Id': "100" } } }- প্রজেকশন, Subjects অ্যারেতে Id "100" মিলে যাওয়া এলিমেন্ট মাত্র রিটার্ন করবে - তৃতীয় আর্গুমেন্ট: কলব্যাক ফাংশন (MongoDB শেলে আউটপুট প্রিন্ট করার জন্য)
গুরুত্বপূর্ণ:
findOne()সবসময় একটি ডকুমেন্ট রিটার্ন করে (পहुँच পাওয়া প্রথমটি)$elemMatchপ্রজেকশনে ব্যবহার করলে অ্যারেতে শুধু প্রথম মিলে যাওয়া এলিমেন্ট রিটার্ন হয়- নেস্টেড লেভেল গভীর হলে এগ্রিগেশন পাইপলাইন (
$unwind,$match,$project) ব্যবহার করুন আরও কন্ট্রোলের জন্য
অ্যাগ্রিগেশন বিকল্প (আধুনিক):
db.demo109.aggregate([
{ $match: { Name: "Chris" } },
{ $unwind: "$Subjects" },
{ $match: { "Subjects.Id": "100" } },
{ $project: { _id: 0, Subjects: 1 } }
])