Để gom nhóm các document trùng lặp (cùng giá trị trường), sử dụng aggregate() với $group.
Tạo collection với tên trùng lặp
> db.demo501.insertOne({"Name":"Chris"});
> db.demo501.insertOne({"Name":"Bob"});
> db.demo501.insertOne({"Name":"Chris"});
> db.demo501.insertOne({"Name":"John"});
> db.demo501.insertOne({"Name":"Chris"});
> db.demo501.insertOne({"Name":"John"});
> db.demo501.insertOne({"Name":"David"});
Hiển thị dữ liệu gốc (7 document)
> db.demo501.find();
Kết quả: Chris(3), Bob(1), John(2), David(1)
Aggregate group by Name lấy giá trị duy nhất
> db.demo501.aggregate([ { $group: { _id: "$Name" } } ])
Kết quả (4 nhóm duy nhất):
{ "_id" : "David" }
{ "_id" : "John" }
{ "_id" : "Bob" }
{ "_id" : "Chris" }
Giải thích:
_id: "$Name": Khóa nhóm là giá trị trườngName- Mỗi giá trị Name riêng biệt tạo thành 1 nhóm
- Kết quả chỉ chứa _id (giá trị Name), không có count
Bổ sung đếm số lần xuất hiện:
> db.demo501.aggregate([
{ $group: { _id: "$Name", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])
Kết quả có thống kê:
{ "_id": "Chris", "count": 3 }
{ "_id": "John", "count": 2 }
{ "_id": "Bob", "count": 1 }
{ "_id": "David", "count": 1 }
Ứng dụng: Tìm duplicate, deduplication, thống kê tần suất, distinct values.