MongoDB-এ একটি ফিল্ডের গড় মান বের করে, তার চেয়ে বড় মান বিশিষ্ট ডকুমেন্টগুলো খোঁজার জন্য Aggregation ($avg) এবং find() (with $gt) কম্বাইন করে ব্যবহার করা হয়।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo552.insertOne({values: 10});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8e3b1c9e5f92834d7f05ea") }
> db.demo552.insertOne({values: 50});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8e3b1f9e5f92834d7f05eb") }
> db.demo552.insertOne({values: 40});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8e3b289e5f92834d7f05ec") }
সব ডকুমেন্ট দেখানো
> db.demo552.find();
আউটপুট:
{ "_id" : ObjectId("5e8e3b1c9e5f92834d7f05ea"), "values" : 10 }
{ "_id" : ObjectId("5e8e3b1f9e5f92834d7f05eb"), "values" : 50 }
{ "_id" : ObjectId("5e8e3b289e5f92834d7f05ec"), "values" : 40 }
গড় মান বের করে তার চেয়ে বড় ডকুমেন্ট খোঁজা
> var findAvg = db.demo552.aggregate([
{ "$group": { "_id": "null", Average: { "$avg": "$values" } } }
]).toArray()[0]["Average"];
> db.demo552.find({ "values": { "$gt": findAvg } })
কোড ব্যাখ্যা
- Aggregation:
$groupদিয়ে সব ডকুমেন্টেরvaluesফিল্ডের গড় ($avg) বের করা হয়।.toArray()[0]["Average"]দিয়ে ফলাফলটি ভেরিয়েবলে সংরক্ষণ করা হয়। (গড় = (10+50+40)/3 = 33.33) - Find:
{ "values": { "$gt": findAvg } }— গড় মানের চেয়ে বড় ($gt)valuesवाले ডকুমেন্ট বের করা হয়।
আউটপুট
{ "_id" : ObjectId("5e8e3b1f9e5f92834d7f05eb"), "values" : 50 }
{ "_id" : ObjectId("5e8e3b289e5f92834d7f05ec"), "values" : 40 }
১০ গড়ের চেয়ে ছোট, তাই বাদ পড়েছে।
আধুনিক বিকল্প: একক Aggregation Pipeline (MongoDB 3.6+)
দুটি আলাদা কোয়েরি না লিখে একটি পাইপলাইনে করতে পারেন $lookup বা $expr দিয়ে, তবে উপরের পদ্ধতিটি সহজ ও বোঝা সহজ।
মূল পয়েন্টসমূহ
$avgAggregation-এ গড় মান বের করতে ব্যবহৃত হয়।$gt(Greater Than) অপারেটর নির্দিষ্ট মানের চেয়ে বড় মান ফিল্টার করতে ব্যবহৃত হয়।- দু-ধাপের পদ্ধতি: ১) গড় বের করুন, ২) সেটি ব্যবহার করে ফিল্টার করুন।
- বড় ডেটাসেটে এগরিগেশন পাইপলাইনে
$bucketবা$percentileও ব্যবহার করা যায়।