Để 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ảngdetails, biến$$dlà mỗi object con.$size: "$$d.details1": Đếm số phần tử của mảngdetails1bên trong object con.- Kết quả
intạ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+).