Sử dụng $avg trong $group kết hợp $ifNull xử lý giá trị null. Tạo collection rating (có ID trùng và null):
> db.demo606.insertOne({id:1,rating:5});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972dfbf57d0dc0b182d623") }
> db.demo606.insertOne({id:1,rating:4});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972dfef57d0dc0b182d624") }
> db.demo606.insertOne({id:2,rating:3});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972e09f57d0dc0b182d625") }
> db.demo606.insertOne({id:1,rating:null});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972e0ef57d0dc0b182d626") }
> db.demo606.insertOne({id:2,rating:null});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972e15f57d0dc0b182d627") }
> db.demo606.insertOne({id:2,rating:3});
{ "acknowledged" : true, "insertedId" : ObjectId("5e972e1bf57d0dc0b182d628") }
Hiển thị dữ liệu (6 bản ghi, 2 ID, có null):
> db.demo606.find();
Aggregation: Nhóm theo id, tính avg rating (null → 0):
> db.demo606.aggregate([ ... { "$group": { ... "_id": "$id", ... "AverageRating": { "$avg": { "$ifNull": ["$rating", 0] } } ... }} ... ]);Kết quả:
- ID 1: (5+4+0)/3 = 3
- ID 2: (3+0+3)/3 = 2
Giải thích:
$ifNull: ["$rating", 0]thay null thành 0 trước khi $avg. Không có $ifNull thì $avg bỏ qua null (kết quả ID 1: (5+4)/2=4.5, ID 2: (3+3)/2=3).