MongoDB cho phép lưu trữ giá trị đặc biệt -Infinity (và Infinity) trong trường số. Khi tính $avg, nếu nhóm chứa giá trị này, kết quả sẽ là -Infinity (theo chuẩn IEEE 754).
Dữ liệu mẫu có -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 }
Xem dữ liệu
> 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 }
Aggregate group by seq và tính $avg Value
> db.demo5.aggregate([{$group:{"_id":"$seq", "average" : {$avg : "$Value"}}}]);
Kết quả
{ "_id" : 20, "average" : 55 }
{ "_id" : 10, "average" : -Infinity }
Giải thích: Nhóm seq:10 có giá trị -Infinity và 50. Theo toán học, (-Infinity + 50) / 2 = -Infinity. Nhóm seq:20 có 60 và 50 -> trung bình 55. Lưu ý: Kiểm tra dữ liệu đầu vào tránh giá trị vô cực nếu không mong muốn, hoặc lọc trước bằng $match: {Value: {$ne: -Infinity}}.