Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ใช้ $concatArrays ร่วม $ifNull ใน MongoDB เพื่อรวม Array ที่อาจมีค่า Null

บทความนี้สาธิตการใช้ $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พฤติกรรมDuplicateOrder
$concatArraysต่อ Array ต่อกันเก็บไว้รักษาลำดับ
$setUnionรวมแบบ Set Unionลบออกเรียงอัตโนมัติ

ตัวอย่างเพิ่มเติม: รวม 3 Array พร้อม Filter ค่า Null ใน Element

db.collection.aggregate([
  { $project: {
    allItems: {
      $concatArrays: [
        { $ifNull: ["$array1", []] },
        { $ifNull: ["$array2", []] },
        { $ifNull: ["$array3", []] }
      ]
    }
  }}
]);