সীমাবদ্ধতা
MongoDB-তে শুধু এমবেডেড ডকুমেন্ট রিটার্ন করা সম্ভব নয়। find() সবসময় পূর্ণ ডকুমেন্ট (রুট লেভেল) রিটার্ন করে। এমবেডেড আRAY-র নির্দিষ্ট এলিমেন্ট ফিল্টার করে আলাদা রিটার্ন করার সরাসরি পদ্ধতি নেই।
উদাহরণ: ডকুমেন্ট তৈরি
> db.queryToEmbeddedDocument.insertOne({
"UserName": "Larry",
"PostDetails": [
{"UserMessage": "Hello", "UserLikes": 8},
{"UserMessage": "Hi", "UserLikes": 6},
{"UserMessage": "Good Morning", "UserLikes": 12},
{"UserMessage": "Awesome", "UserLikes": 4}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c988a9f330fd0aa0d2fe4bd") }
কুয়েরি: UserLikes >= 8 ফিল্টার (প্রজেকশন সহ)
> db.queryToEmbeddedDocument.find(
{"PostDetails.UserLikes": {$gte: 8}},
{PostDetails: 1}
).pretty();
আউটপুট: পুরো PostDetails অ্যারে রিটার্ন হয় (UserLikes: 6 এবং 4 ও থাকবে)।
{
"_id" : ObjectId("5c988a9f330fd0aa0d2fe4bd"),
"PostDetails" : [
{"UserMessage": "Hello", "UserLikes": 8},
{"UserMessage": "Hi", "UserLikes": 6},
{"UserMessage": "Good Morning", "UserLikes": 12},
{"UserMessage": "Awesome", "UserLikes": 4}
]
}
সমাধান: Aggregation Pipeline ($unwind + $match)
শুধু মিলে যাওয়া এমবেডেড ডকুমেন্ট পাওয়ার জন্য অগ리게েশন ব্যবহার করুন:
db.queryToEmbeddedDocument.aggregate([
{ $unwind: "$PostDetails" },
{ $match: { "PostDetails.UserLikes": { $gte: 8 } } },
{ $replaceRoot: { newRoot: "$PostDetails" } }
]);
এটি শুধু ফিল্টার করা এমবেডেড ডকুমেন্ট গুলো রিটার্ন করবে।