Khi bạn có mảng các object (ví dụ: [{Name1: "Chris", Name2: "David"}, {Name1: "John", Name2: "John"}]) và chỉ muốn trích xuất **các giá trị** thành mảng phẳng (flatten) hoặc mảng các cặp giá trị, hãy dùng $map trong stage $project của Aggregation Pipeline.
1. Tạo dữ liệu
> db.demo411.insertOne({
"Information": [
{ "Name1": "Chris", "Name2": "David" },
{ "Name1": "John", "Name2": "John" }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e70f19715dc524f70227682") }
2. Xem dữ liệu gốc
> db.demo411.find();
Kết quả: Mảng Information chứa 2 object.
3. Aggregation: Biến mỗi object thành mảng [Name1, Name2]
> db.demo411.aggregate([
{
$project: {
_id: 0,
Information: {
$map: {
input: "$Information",
as: "out",
in: ["$$out.Name1", "$$out.Name2"]
}
}
}
}
]);
4. Kết quả
{ "Information": [ ["Chris", "David"], ["John", "John"] ] }
Giải thích:
$map: Duyệt mảnginput, biếnasđại diện phần tử hiện tại.in: ["$$out.Name1", "$$out.Name2"]: Tạo mảng mới từ 2 trường của object.- Kết quả: Mảng 2 chiều (mảng các mảng cặp giá trị).
Biến thể: Làm phẳng (flatten) thành 1 mảng đơn: Thêm $reduce hoặc $concatArrays sau $map.
$project: {
allNames: {
$reduce: {
input: { $map: { input: "$Information", as: "out", in: ["$$out.Name1", "$$out.Name2"] } },
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] }
}
}
}
// Kết quả: { "allNames": ["Chris", "David", "John", "John"] }