Làm phẳng mảng lồng nhau (flatten) trong aggregation
Kết hợp $reduce và $concatArrays để gộp mảng 2 chiều thành mảng 1 chiều.
Dữ liệu mảng lồng nhau
> db.demo338.insertOne({
"Name": "Chris",
"Marks1": [[56, 67, 45], [67, 89, 90, 91]]
});
Pipeline flatten mảng
> db.demo338.aggregate([
{
$project: {
"Marks": {
$reduce: {
input: "$Marks1",
initialValue: [],
in: { $concatArrays: ["$$this", "$$value"] }
}
}
}
}
]);
Kết quả
{ "_id": ObjectId("..."), "Marks": [67, 89, 90, 91, 56, 67, 45] }
Giải thích $reduce:
input: Mảng cần reduce (Marks1 - mảng các mảng)initialValue: Giá trị khởi tạo (mảng rỗng [])in: Biểu thức tích lũy - nối mảng hiện tại ($$this) vào accumulator ($$value)
Thứ tự: Kết quả theo thứ tự duyệt: mảng con đầu tiên nối vào rỗng, mảng con thứ 2 nối vào kết quả trước...