MongoDB एग्रीगेशन में $filter: एम्बेडेड सरणी पर रेंज क्वेरी
$filter ऑपरेटर सरणी के तत्वों को शर्त के आधार पर फ़िल्टर करता है। $match (दस्तावेज़ स्तर) और $addFields (सरणी आकार बदलना) के साथ संयोजित करके जटिल रेंज क्वेरीज़ करें।
नमूना डेटा
> db.demo346.insertOne({_id: 101, userDetails: [{UserName: "Chris", Score: 78}, {UserName: "David", Score: 68}, {UserName: "Bob", Score: 88}]});
{ "acknowledged": true, "insertedId": 101 }
> db.demo346.insertOne({_id: 102, userDetails: [{UserName: "Mike", Score: 92}, {UserName: "Sam", Score: 62}, {UserName: "Carol", Score: 97}]});
{ "acknowledged": true, "insertedId": 102 }
एग्रीगेशन: Score 80-99 वाले उपयोगकर्ता रखें
> db.demo346.aggregate([
{$match: {$expr: {$gte: [{$size: {$ifNull: ["$userDetails", []]}}, 1]}}},
{$addFields: {
userDetails: {$filter: {
input: {$ifNull: ["$userDetails", []]},
cond: {$and: [{$gte: ["$$this.Score", 80]}, {$lte: ["$$this.Score", 99]}]}
}}
}}
]);
परिणाम
{ "_id": 101, "userDetails": [{"UserName": "Bob", "Score": 88}] }
{ "_id": 102, "userDetails": [{"UserName": "Mike", "Score": 92}, {"UserName": "Carol", "Score": 97}] }
पहला $match खाली सरणी वाले दस्तावेज़ों को बाहर करता है ($ifNull सुरक्षा)। $filter प्रत्येक userDetails तत्व पर $$this के माध्यम से रेंज शर्त लागू करता है। केवल 80-99 रेंज वाले स्कोर रखे जाते हैं।