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

Thực hiện $concatArrays trong MongoDB khi có giá trị null

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ếu expression là 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 ý

  • $concatArrays yêu cầu tất cả đối số là mảng
  • Khác với $setUnion: $concatArrays giữ trùng lặp và thứ tự
  • Kết quả không được lưu vào DB trừ khi dùng $merge hoặc $out
  • Giới hạn 16MB cho document kết quả