Sử dụng aggregation pipeline phức tạp: $unwind → $group cấp 1 (theo Name+Marks) → $group cấp 2 (theo Name, gom Marks duy nhất với $addToSet) → $project. Tạo collection:
> db.demo586.insertOne({ "details": [ { "Name":"Chris", "Marks":71 }, { "Name":"Chris", "Marks":61 }, { "Name":"David", "Marks":81 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e9200fefd2d90c177b5bcc7") }
> db.demo586.insertOne({ "details": [ { "Name":"Chris", "Marks":71 }, { "Name":"Carol", "Marks":61 }, { "Name":"David", "Marks":81 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e9200fefd2d90c177b5bcc8") }
Hiển thị dữ liệu (2 tài liệu, mảng details):
> db.demo586.find();
Pipeline đầy đủ:
> var q = [ ... { "$unwind": "$details" }, ... { "$group": { "_id": { "Name": "$details.Name", "Marks": "$details.Marks" }, "count": { "$sum": 1 } } }, ... { "$group": { "_id": "$_id.Name", "distinctV": { "$addToSet": { "value": "$_id.Marks", "numberOfValues": "$count" } } } }, ... { "$project": { "_id": 0, "Name": "$_id", "distinctV": 1 } } ... ]; > db.demo586.aggregate(q);Kết quả (Marks duy nhất mỗi Name kèm số lần xuất hiện):
Giải thích: Chris có Marks 71 xuất hiện 2 lần (2 tài liệu), 61 xuất hiện 1 lần. Carol chỉ có 61 (1 lần). David có 81 (2 lần).