Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 일부 값이 null이어도 $concatArrays로 배열 합치기 – $ifNull 활용법

MongoDB $concatArrays와 $ifNull로 null 값 처리하기

MongoDB의 애그리게이션(aggregate) 프레임워크에서 $concatArrays는 여러 배열을 하나로 연결할 때 사용하는 연산자입니다. 다만 연결하려는 필드 중 하나라도 null이거나 아예 존재하지 않으면 에러가 발생합니다. 이럴 때 $ifNull 연산자를 함께 사용하면 null 값을 빈 배열([])로 치환하여 안전하게 배열을 합칠 수 있습니다.

1. 샘플 컬렉션 생성

먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. 두 번째 문서에는 SecondSemesterSubjects 필드가 없다는 점에 주목하세요.

> 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")
}

2. 저장된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

> 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"
   ]
}

3. null이 있어도 배열 합치기

다음은 $project 단계에서 $concatArrays와 $ifNull을 조합하여, 필드가 null이어도 배열을 정상적으로 연결하는 쿼리입니다.

> db.concatenateArraysDemo.aggregate([
   {$project: {
      ConcatenateArrays: { '$concatArrays': [
         {$ifNull: ['$FirstSemesterSubjects', []]},
         {$ifNull: ['$SecondSemesterSubjects', []]}
      ] }
   }}
]);

실행 결과는 다음과 같습니다. 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" ] }

핵심 포인트: $ifNull은 첫 번째 인자의 값이 null이거나 해당 필드 자체가 존재하지 않을 때, 두 번째 인자로 지정한 기본값을 대신 반환합니다. 따라서 $concatArrays에 전달되는 모든 인수가 항상 유효한 배열이 되도록 보장할 수 있으며, 데이터가 불완전한 컬렉션에서도 안정적으로 배열 병합 작업을 수행할 수 있습니다.