Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Khớp và nhóm phần tử mảng với giá trị lớn nhất trong MongoDB Aggregation

Để 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 $map trích xuất điểm số, $max tìm giá trị lớn nhất, $filter lọc phần tử có điểm cao nhất, $arrayElemAt lấy phần tử đầu tiên, cuối cùng $group đếm theo tên.