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

MongoDB에서 $all 연산자로 배열 요소 순서와 무관하게 정확한 배열 일치 찾기

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 연산자로 배열의 길이를 함께 지정하면 됩니다. 이 두 연산자를 조합하면 값의 구성과 개수가 정확히 일치하는 문서만 효율적으로 조회할 수 있습니다.