Transpose mảng với $zip và $map trong aggregation
Toán tử $zip ghép các mảng theo vị trí (index), tạo mảng mới chứa các cặp giá trị. Kết hợp $map để reshape thành object.
Dữ liệu điểm số
> db.demo339.insertOne({Id: 101, Score1: ["98", "56"], Score2: [67, 89]});
Pipeline zip và reshape
> db.demo339.aggregate([
{
$project: {
"AllArrayObject": {
$map: {
input: {
$objectToArray: {
$arrayToObject: {
$zip: {
inputs: ["$Score1", "$Score2"]
}
}
}
},
as: "el",
in: { "Score1": "$$el.k", "Score2": "$$el.v" }
}
}
}
}
]);
Kết quả
{
"_id": ObjectId("..."),
"AllArrayObject": [
{ "Score1": "98", "Score2": 67 },
{ "Score1": "56", "Score2": 89 }
]
}
Luồng xử lý: $zip tạo [[k,v],...] → $arrayToObject tạo {k:v,...} → $objectToArray tạo [{k,v},...] → $map reshape.
Lưu ý: Các mảng phải cùng độ dài. Từ MongoDB 5.0, có thể dùng $zip: { inputs: [...], useLongestLength: true }.