MongoDB에서 배열 필드의 정확한 일치(exact match)를 찾고 싶은데, 배열 안 값들의 순서가 달라도 매칭되도록 하려면 어떻게 해야 할까요? 이럴 때 $all 연산자를 사용하면 됩니다. $all은 지정한 모든 값이 배열에 포함되어 있는지만 확인하고 요소의 순서는 고려하지 않습니다. 여기에 $size 연산자를 함께 조합하면 배열의 길이(요소 개수)까지 지정할 수 있어, 사실상 "순서에 상관없는 정확한 배열 일치" 조건을 완성할 수 있습니다.
예제 컬렉션 생성 및 데이터 삽입
먼저 실습용 컬렉션을 만들고 문서를 삽입해 보겠습니다. 학생 이름, 나이, 게임 점수 배열을 가진 문서 두 개를 추가합니다.
> db.exactMatchArrayDemo.insertOne({"StudentName":"David","StudentAge":22,"StudentGameScores":[45,78,98]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c94702d6669774125246c")
}
> db.exactMatchArrayDemo.insertOne({"StudentName":"Chris","StudentAge":23,"StudentGameScores":[45,78]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c94a42d6669774125246d")
}저장된 전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.exactMatchArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5c9c94702d6669774125246c"),
"StudentName" : "David",
"StudentAge" : 22,
"StudentGameScores" : [
45,
78,
98
]
}
{
"_id" : ObjectId("5c9c94a42d6669774125246d"),
"StudentName" : "Chris",
"StudentAge" : 23,
"StudentGameScores" : [
45,
78
]
}$all과 $size로 정확한 배열 일치 조회하기
이제 $all과 $size를 함께 사용해 정확한 배열 일치를 찾아보겠습니다. 아래 쿼리는 StudentGameScores 배열의 길이가 2이면서, 78과 45 두 값을 모두 포함하는 문서를 조회합니다. 값의 순서가 [78, 45]로 저장된 순서([45, 78])와 달라도 정상적으로 매칭됩니다.
> db.exactMatchArrayDemo.find({ "StudentGameScores": { "$size" : 2, "$all": [ 78, 45 ] } }).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9c94a42d6669774125246d"),
"StudentName" : "Chris",
"StudentAge" : 23,
"StudentGameScores" : [
45,
78
]
}배열 크기를 변경하여 조회하기
같은 방식으로 $size 값을 3으로 바꾸면, 세 개의 값을 가진 StudentGameScores 필드를 가진 문서를 조회할 수 있습니다. 역시 이 경우에도 값의 순서는 중요하지 않습니다.
> db.exactMatchArrayDemo.find({ "StudentGameScores": { "$size" : 3, "$all": [ 78, 45 ] } }).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9c94702d6669774125246c"),
"StudentName" : "David",
"StudentAge" : 22,
"StudentGameScores" : [
45,
78,
98
]
}정리
MongoDB에서 배열 요소의 순서와 관계없이 정확한 배열 일치를 찾으려면 $all 연산자로 필요한 모든 값의 포함 여부를 확인하고, $size 연산자로 배열의 길이를 함께 지정하면 됩니다. 이 두 연산자를 조합하면 값의 구성과 개수가 정확히 일치하는 문서만 효율적으로 조회할 수 있습니다.