Để đếm tần suất (frequency) của giá trị trường, dùng $group với $sum: 1 trong aggregate pipeline.
Dữ liệu mẫu
> db.demo232.insertOne({_id:101,Name:"Chris"});
> db.demo232.insertOne({_id:102,Name:"Bob"});
> db.demo232.insertOne({_id:103,Name:"Bob"});
> db.demo232.insertOne({_id:104,Name:"David"});
> db.demo232.insertOne({_id:105,Name:"Chris"});
Pipeline aggregate đếm tần suất
> db.demo232.aggregate( { $group: { _id: "$Name", Frequency: { $sum: 1 } } } );
Kết quả
{ "_id" : "David", "Frequency" : 1 }
{ "_id" : "Bob", "Frequency" : 2 }
{ "_id" : "Chris", "Frequency" : 2 }
Giải thích:
_id: "$Name": Nhóm theo giá trị trường NameFrequency: {$sum: 1}: Mỗi document trong nhóm cộng 1- Kết quả sắp xếp theo _id mặc định (alphabet cho string)
Mở rộng - Sắp xếp theo tần suất:
db.demo232.aggregate([
{ $group: { _id: "$Name", Frequency: { $sum: 1 } } },
{ $sort: { Frequency: -1 } }
]);
Kết quả: Bob(2), Chris(2), David(1).
Top N: Thêm {$limit: 5} sau $sort.
Phần trăm: Dùng $facet hoặc 2 pipeline để tính tổng rồi chia.