MongoDB Aggregate-এ -Infinity মান থাকলে $avg এর আচরণ
যদি কোনো নাম্বার ফিল্ডে -Infinity (নেগেটিভ ইনফিনিটি) থাকে, তবে $avg অ্যাকুমুলেটর সেটি গণনায় অন্তর্ভুক্ত করে এবং ফলাফলও -Infinity হয়। কারণ গাণিতিকভাবে যেকোনো সংখ্যা -Infinity-এর সাথে অপারেশন করলে -Infinity হয়।
উদাহরণ: -Infinity সহ ডেটা ইনসার্ট
> db.demo5.insertOne({ "_id" : 100, "seq" : 10, "Value" : -Infinity });
{ "acknowledged" : true, "insertedId" : 100 }
> db.demo5.insertOne({ "_id" : 101, "seq" : 10, "Value" : 50 });
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo5.insertOne({ "_id" : 102, "seq" : 20, "Value" : 60 });
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo5.insertOne({ "_id" : 103, "seq" : 20, "Value" : 50 });
{ "acknowledged" : true, "insertedId" : 103 }
সব ডকুমেন্ট দেখানো
> db.demo5.find();
আউটপুট:
{ "_id" : 100, "seq" : 10, "Value" : -Infinity }
{ "_id" : 101, "seq" : 10, "Value" : 50 }
{ "_id" : 102, "seq" : 20, "Value" : 60 }
{ "_id" : 103, "seq" : 20, "Value" : 50 }
seq অনুযায়ী গ্রুপ করে গড় বের করা
> db.demo5.aggregate([{$group:{"_id":"$seq", "average" : {$avg : "$Value"}}}]);
আউটপুট:
{ "_id" : 20, "average" : 55 }
{ "_id" : 10, "average" : -Infinity }
ব্যাখ্যা
seq:10গ্রুপেValue: -Infinity, 50 — গড় = -Infinity।seq:20গ্রুপেValue: 60, 50 — গড় = 55।- MongoDB
$avg-এInfinity/-Infinityহ্যান্ডেল করে না (স্কিপ করে না), সেটি প্রসেস করে ফলাফল ইনফিনিটি দেয়।
সমাধান: ইনফিনিটি মান ফিল্টার আউট করুন: {$match: {Value: {$ne: -Infinity}}} গ্রুপের আগে। অথবা $cond দিয়ে শুধু ফিনাইট মান গড় করুন।