Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tính trung bình rating theo ID trùng lặp trong MongoDB

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).