কম্পিউটার টিউটোরিয়াল

MongoDB-তে কুয়েরি দিয়ে শুধু এমবেডেড ডকুমেন্ট রিটার্ন করা সম্ভব কি?

সীমাবদ্ধতা

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" } }
]);

এটি শুধু ফিল্টার করা এমবেডেড ডকুমেন্ট গুলো রিটার্ন করবে।

  1. MongoDB-এ নির্দিষ্ট ডকুমেন্টের ফিল্ড ইনক্রিমেন্ট করা ($inc অপারেটর)

  2. MongoDB-তে এমবেডেড ডকুমেন্ট কোয়েরি করা (aggregate + $unwind)

  3. MongoDB-তে নেস্টেড ডকুমেন্ট আপডেট করা (ডট নোটেশন + পজিশনাল $)

  4. MongoDB-এ এমবেডেড ডকুমেন্টের অ্যারে ফিল্টার করা (৩ লেভেল)