MongoDB-এ $addFields পাইপলাইন স্টেজে $filter অপারেটর ব্যবহার করে অ্যারে ফিল্ডকে ফিল্টার করা এবং নতুন ফিল্ড হিসেবে যোগ করা যায়। এটি ডকুমেন্ট স্ট্রাকচার বদলে দিয়ে ফিল্টারড ডেটা রাখে।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo118.insertOne({
... "Id" : "101",
... "Name" : "Chris",
... "Subjects" : [ "MySQL", "MongoDB", "Java" ],
... "Details" : [
... { "Name" : "David", "S": "MongoDB" },
... { "Name" : "Bob", "S": "Python" }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2f0c0cd8f64a552dae6364") }
সব ডকুমেন্ট দেখানো
> db.demo118.find();
আউটপুট:
{ "_id" : ObjectId("5e2f0c0cd8f64a552dae6364"), "Id" : "101", "Name" : "Chris", "Subjects" : [ "MySQL", "MongoDB", "Java" ], "Details" : [ { "Name" : "David", "S" : "MongoDB" }, { "Name" : "Bob", "S" : "Python" } ] }
$addFields এবং $filter ব্যবহার করে কোয়ারী
Details অ্যারেটে S ফিল্ডের মান Subjects অ্যারেতে আছে কিনা চেক করে ফিল্টার করা হয়েছে:
> db.demo118.aggregate([
... {
... "$addFields": {
... "Details": {
... "$filter": {
... "input": "$Details",
... "as": "out",
... "cond": { "$in": [ "$$out.S", "$Subjects" ] }
... }
... }
... }
... }
... ]).pretty();
ফলাফল
{ "_id" : ObjectId("5e2f0c0cd8f64a552dae6364"), "Id" : "101", "Name" : "Chris", "Subjects" : [ "MySQL", "MongoDB", "Java" ], "Details" : [ { "Name" : "David", "S" : "MongoDB" } ] }
ব্যাখ্যা:
$addFields- নতুন ফিল্ড যোগ করে বা এক্সিস্টিং ফিল্ড ওভাররাইট করে (এখানে Details ওভাররাইট)$filter-input: "$Details"অ্যারেটে প্রতিটি এলিমেন্ট ($$out) চেক করে$in: ["$$out.S", "$Subjects"]- এলিমেন্টেরSফিল্ডSubjectsঅ্যারেতে আছে কিনা চেক করে- শুধু David-এর S="MongoDB" Subjects-এ আছে, Bob-এর S="Python" নেই → David মাত্র রাখা হয়েছে
$filter সিনট্যাক্স:
{ $filter: { input: , as: , cond: } }
বিকল্প: $project ব্যবহার করলে:
db.demo118.aggregate([
{ $project: {
Id: 1, Name: 1, Subjects: 1,
Details: { $filter: { input: "$Details", as: "out", cond: { $in: ["$$out.S", "$Subjects"] } } }
}}
])
$project শুধু নির্দিষ্ট ফিল্ড রাখে, $addFields সব ফিল্ড রেখে নতুন ফিল্ড যোগ/ওভাররাইট করে।
ব্যবহার ক্ষেত্র: লুকআপ (join) এর পর রেজাল্ট ফিল্টারিং, সাব-ডকুমেন্ট ক্লিনআপ, কন্ডিশনাল অ্যারে প্রসেসিং।