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

Lấy chỉ giá trị (values) từ mảng object trong MongoDB Aggregation

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ảng input, biến as đạ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"] }