Để tính tần suất (frequency) của các giá trị trùng lặp, sử dụng $group trong aggregate().
Tạo collection với tên trùng lặp
> db.demo635.insertOne({Name:"Chris"});
> db.demo635.insertOne({Name:"David"});
> db.demo635.insertOne({Name:"David"});
> db.demo635.insertOne({Name:"Chris"});
> db.demo635.insertOne({Name:"Bob"});
> db.demo635.insertOne({Name:"Chris"});
Hiển thị dữ liệu gốc
> db.demo635.find();
Kết quả (6 document):
{ "Name" : "Chris" }, { "Name" : "David" }, { "Name" : "David" },
{ "Name" : "Chris" }, { "Name" : "Bob" }, { "Name" : "Chris" }
Aggregate tính tần suất
> db.demo635.aggregate([
{ $unwind: "$Name" },
{ $group: { "_id": "$Name", TotalFrequency: { $sum: 1 } } }
]);
Kết quả:
{
"_id" : "David", "TotalFrequency" : 2
}
{
"_id" : "Bob", "TotalFrequency" : 1
}
{
"_id" : "Chris", "TotalFrequency" : 3
}
Giải thích:
$unwind: "$Name": Ở đâyNamelà chuỗi (không phải mảng),$unwindvẫn hoạt động - nó giữ nguyên document (tương đương không làm gì). Lưu ý: NếuNamelà mảng thì$unwindsẽ phân rã thành nhiều document.$group: Gom theoName,$sum: 1đếm số lần xuất hiện- Kết quả sắp xếp theo thứ tự alphabet của
_id
Đây là pattern chuẩn cho bài toán "word count" hoặc thống kê tần suất giá trị.