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

Nhóm trường lồng nhau trong MongoDB aggregate với đếm mảng

Để nhóm và đếm số lượng phần tử mảng từ các trường lồng nhau động, dùng $objectToArray, $unwind và $group.

Dữ liệu mẫu phức tạp

2 document với cấu trúc:
Details: { 
    X: { Values: [10,30,50], Number: 3 }, 
    Y: { Values: [1000,180], Number: 2 } 
}
Details: { 
    X: { Values: [100,300,500,6000], Number: 4 }, 
    Y: { Values: [10,20,60], Number: 3 } 
}

Pipeline aggregate

> db.demo99.aggregate([
    { $project: { Count: { $objectToArray: "$Details" } } },
    { $unwind: "$Count" },
    { $group: { 
        _id: "$Count.k", 
        count: { $sum: "$Count.v.Number" } 
    }}
]);

Kết quả

{ "_id" : "Y", "count" : 5 }
{ "_id" : "X", "count" : 7 }

Giải thích từng bước:

  1. $objectToArray: "$Details": Chuyển object {X:..., Y:...} thành mảng [{k:"X", v:{...}}, {k:"Y", v:{...}}]
  2. $unwind: "$Count": Tách mảng thành 2 document riêng (mỗi doc 1 key X hoặc Y)
  3. $group: Nhóm theo _id: "$Count.k" (tên key X/Y), cộng dồn $Count.v.Number

Kết quả: X: 3+4=7, Y: 2+3=5. Cách này linh hoạt khi tên trường con (X, Y) không cố định hoặc nhiều hơn.