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에 전달되는 모든 인수가 항상 유효한 배열이 되도록 보장할 수 있으며, 데이터가 불완전한 컬렉션에서도 안정적으로 배열 병합 작업을 수행할 수 있습니다.