Toán tử $concatArrays trong Aggregation Pipeline nối nhiều mảng thành một. Tuy nhiên, nếu bất kỳ mảng nào là null hoặc không tồn tại, toàn bộ phép nối sẽ trả về null. Để xử lý trường hợp này, sử dụng $ifNull để thay thế null bằng mảng rỗng [].
Tạo dữ liệu mẫu
> db.concatenateArraysDemo.insertOne({"FirstSemesterSubjects": ["MongoDB","MySQL","Java"],"SecondSemesterSubjects":["C","C++"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd687707924bb85b3f4895c") }
> db.concatenateArraysDemo.insertOne({"FirstSemesterSubjects":["C#","Ruby","Python"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd687927924bb85b3f4895d") }
> db.concatenateArraysDemo.insertOne({"FirstSemesterSubjects":["HTML","CSS","Javascript"],"SecondSemesterSubjects":["CSS","Javascript"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd687bb7924bb85b3f4895e") }
Xem dữ liệu (lưu ý tài liệu 2 thiếu SecondSemesterSubjects)
> db.concatenateArraysDemo.find().pretty();
Nối mảng an toàn với $ifNull
> db.concatenateArraysDemo.aggregate([ {$project: { ConcatenateArrays: { '$concatArrays': [ {$ifNull: ['$FirstSemesterSubjects', []]}, {$ifNull: ['$SecondSemesterSubjects', []]} ] } }} ]);Kết quả
Giải thích
$ifNull: [expression, replacement]: Nếuexpressionlà null hoặc missing, trả vềreplacement[$ifNull: ['$FirstSemesterSubjects', []]]: Nếu trường thiếu hoặc null → dùng mảng rỗng$concatArrays: Nối các mảng theo thứ序- Tài liệu 2: Chỉ có FirstSemesterSubjects → kết quả chỉ chứa mảng đó
Nối nhiều mảng (3+)
db.collection.aggregate([{$project: {
AllArrays: {$concatArrays: [
{$ifNull: ["$Array1", []]},
{$ifNull: ["$Array2", []]},
{$ifNull: ["$Array3", []]},
{$ifNull: ["$Array4", []]}
]}
}}]);
Cách khác: $reduce (linh hoạt hơn)
db.concatenateArraysDemo.aggregate([{$project: {
ConcatenateArrays: {
$reduce: {
input: ["$FirstSemesterSubjects", "$SecondSemesterSubjects"],
initialValue: [],
in: {$concatArrays: ["$$value", {$ifNull: ["$$this", []]}]}
}
}
}}]);
Lưu ý
$concatArraysyêu cầu tất cả đối số là mảng- Khác với
$setUnion:$concatArraysgiữ trùng lặp và thứ tự - Kết quả không được lưu vào DB trừ khi dùng
$mergehoặc$out - Giới hạn 16MB cho document kết quả