Để khớp và nhóm các phần tử mảng có giá trị lớn nhất, sử dụng $group kết hợp $max trong pipeline aggregation. Tạo collection mẫu:
> db.demo510.insertOne({
details: [
{ Name: "Chris", Score: 56 },
{ Name: "David", Score: 45 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8845fa987b6e0e9d18f582") }
> db.demo510.insertOne({
details: [
{ Name: "Chris", Score: 56 },
{ Name: "David", Score: 47 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8845fb987b6e0e9d18f583") }
> db.demo510.insertOne({
details: [
{ Name: "Chris", Score: 45 },
{ Name: "David", Score: 91 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8845fb987b6e0e9d18f584") }
Hiển thị dữ liệu:
> db.demo510.find();
Kết quả:
Pipeline aggregation phức tạp để lấy phần tử có Score lớn nhất trong mỗi tài liệu, sau đó nhóm theo tên:
> db.demo510.aggregate([ { "$project": { "details": { "$arrayElemAt": [ { "$filter": { "input": "$details", "as": "res", "cond": { "$eq": [ "$$res.Score", { "$max": { "$map": { "input": "$details", "as": "out", "in": "$$out.Score" } }} ] } }}, 0 ] } }}, { "$group": { "_id": "$details.Name", "Name": { "$first": "$details.Name" }, "count": { "$sum": 1 } }} ])Kết quả: David xuất hiện 1 lần có điểm cao nhất (91), Chris xuất hiện 2 lần (56, 56):
Giải thích: Pipeline sử dụng
$maptrích xuất điểm số,$maxtìm giá trị lớn nhất,$filterlọc phần tử có điểm cao nhất,$arrayElemAtlấy phần tử đầu tiên, cuối cùng$groupđếm theo tên.