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

Tạo trường mới chứa số lượng phần tử mảng lồng trong MongoDB ($addFields + $size)

Để thêm trường mới vào tài liệu chứa **số lượng phần tử** của một mảng lồng nhau (nested array), bạn dùng $addFields kết hợp $map (duyệt mảng cha) và $size (đếm độ dài mảng con) trong Aggregation Pipeline.

1. Tạo dữ liệu phức tạp: details là mảng object, mỗi object có mảng details1

> db.demo429.insertOne({
    "_id": 101,
    "Value": 3,
    "details": [
        { "Age": 29, "Value": 3, "details1": [1, 2, 3] },
        { "Age": 31, "Value": 4, "details1": [354] }
    ]
});

2. Xem dữ liệu

> db.demo429.find();

Kết quả: details[0].details1 có 3 phần tử, details[1].details1 có 1 phần tử.

3. Aggregation: Thêm trường NumberOfDetails1 = size(details1)

> db.demo429.aggregate([
    {
        $addFields: {
            "details": {
                $map: {
                    input: "$details",
                    as: "d",
                    in: {
                        "Age": "$$d.Age",
                        "NumberOfDetails1": { $size: "$$d.details1" }
                    }
                }
            }
        }
    }
]);

4. Kết quả

{ "_id": 101, "Value": 3, "details": [
    { "Age": 29, "NumberOfDetails1": 3 },
    { "Age": 31, "NumberOfDetails1": 1 }
] }

Giải thích:

  • $addFields: Thêm/sửa trường (giữ nguyên các trường khác).
  • $map: Duyệt mảng details, biến $$d là mỗi object con.
  • $size: "$$d.details1": Đếm số phần tử của mảng details1 bên trong object con.
  • Kết quả in tạo object mới chỉ giữ Age và NumberOfDetails1 (Value, details1 gốc bị loại).

Lưu ý: $size chỉ dùng trong Aggregation. Trong find() query, dùng { $expr: { $eq: [{ $size: "$array" }, 3] } } (MongoDB 3.6+).