บทความนี้สาธิตการใช้ $concatArrays ใน Aggregation Framework ร่วมกับ $ifNull เพื่อต่อ (Concatenate) Array หลายฟิลด์ โดยจัดการกรณีที่บางฟิลด์เป็น null หรือ missing ให้กลายเป็น Empty Array ก่อน
สร้างข้อมูลตัวอย่าง (มี Field ที่ Null/หายไป)
> 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") }
แสดงข้อมูล (Document ที่ 2 ไม่มี SecondSemesterSubjects)
> db.concatenateArraysDemo.find().pretty();
{
"_id" : ObjectId("5cd687707924bb85b3f4895c"),
"FirstSemesterSubjects" : [ "MongoDB", "MySQL", "Java" ],
"SecondSemesterSubjects" : [ "C", "C++" ]
}
{
"_id" : ObjectId("5cd687927924bb85b3f4895d"),
"FirstSemesterSubjects" : [ "C#", "Ruby", "Python" ]
}
{
"_id" : ObjectId("5cd687bb7924bb85b3f4895e"),
"FirstSemesterSubjects" : [ "HTML", "CSS", "Javascript" ],
"SecondSemesterSubjects" : [ "CSS", "Javascript" ]
}
Concatenate Arrays แม้จะมี Null (ใช้ $ifNull)
> db.concatenateArraysDemo.aggregate([
{ $project: {
ConcatenateArrays: {
'$concatArrays': [
{ $ifNull: ['$FirstSemesterSubjects', []] },
{ $ifNull: ['$SecondSemesterSubjects', []] }
]
}
}}
]);
ผลลัพธ์
{ "_id" : ObjectId("5cd687707924bb85b3f4895c"), "ConcatenateArrays" : [ "MongoDB", "MySQL", "Java", "C", "C++" ] }
{ "_id" : ObjectId("5cd687927924bb85b3f4895d"), "ConcatenateArrays" : [ "C#", "Ruby", "Python" ] }
{ "_id" : ObjectId("5cd687bb7924bb85b3f4895e"), "ConcatenateArrays" : [ "HTML", "CSS", "Javascript", "CSS", "Javascript" ] }
คำอธิบาย
$concatArrays: ต่อ Array หลายตัวเข้าด้วยกัน (เก็บลำดับและค่าซ้ำไว้)$ifNull: [expression, replacement]: ถ้า Expression เป็น Null/Missing ให้ใช้ Replacement แทน (ในที่คือ Empty Array[])- หากไม่ใช้ $ifNull และ Field หนึ่งเป็น Null → $concatArrays จะ Error: "concatArrays requires array inputs"
ความแตกต่าง $concatArrays vs $setUnion
| Operator | พฤติกรรม | Duplicate | Order |
|---|---|---|---|
$concatArrays | ต่อ Array ต่อกัน | เก็บไว้ | รักษาลำดับ |
$setUnion | รวมแบบ Set Union | ลบออก | เรียงอัตโนมัติ |
ตัวอย่างเพิ่มเติม: รวม 3 Array พร้อม Filter ค่า Null ใน Element
db.collection.aggregate([
{ $project: {
allItems: {
$concatArrays: [
{ $ifNull: ["$array1", []] },
{ $ifNull: ["$array2", []] },
{ $ifNull: ["$array3", []] }
]
}
}}
]);