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

MongoDB $in 연산자로 배열 목록에서 하나 이상 일치하는 문서 조회하는 방법

MongoDB에서 배열 타입의 필드를 쿼리할 때, 여러 값 중 하나라도 일치하는 문서를 찾고 싶다면 $in 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $in 연산자로 배열 내 최소 한 개의 일치 항목을 조회하는 방법을 단계별로 알아보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 테스트에 사용할 컬렉션을 만들고 문서를 삽입합니다. 각 문서에는 학생이 좋아하는 과목 목록을 배열 형태로 저장했습니다.

> db.atleastOneMatchDemo.insertOne({"StudentFavouriteSubject":["MySQL","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2db5db64f4b851c3a13ce")
}
> db.atleastOneMatchDemo.insertOne({"StudentFavouriteSubject":["Java","C","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2db71b64f4b851c3a13cf")
}
> db.atleastOneMatchDemo.insertOne({"StudentFavouriteSubject":["Python","C++","SQL Server"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2db87b64f4b851c3a13d0")
}
> db.atleastOneMatchDemo.insertOne({"StudentFavouriteSubject":["Ruby","Javascript","C#","MySQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2dba9b64f4b851c3a13d1")
}

2. find() 메서드로 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. 가독성을 높이기 위해 pretty() 메서드를 함께 사용했습니다.

> db.atleastOneMatchDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd2db5db64f4b851c3a13ce"),
   "StudentFavouriteSubject" : [
      "MySQL",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd2db71b64f4b851c3a13cf"),
   "StudentFavouriteSubject" : [
      "Java",
      "C",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd2db87b64f4b851c3a13d0"),
   "StudentFavouriteSubject" : [
      "Python",
      "C++",
      "SQL Server"
   ]
}
{
   "_id" : ObjectId("5cd2dba9b64f4b851c3a13d1"),
   "StudentFavouriteSubject" : [
      "Ruby",
      "Javascript",
      "C#",
      "MySQL"
   ]
}

총 4개의 문서가 저장되어 있으며, 세 번째 문서(“Python”, “C++”, “SQL Server”)만 조건 대상 값인 “MongoDB” 또는 “MySQL”을 포함하고 있지 않습니다.

3. $in 연산자로 최소 하나의 일치 항목 조회하기

이제 $in 연산자를 사용하여 배열 안에 “MongoDB” 또는 “MySQL” 중 적어도 하나가 포함된 문서만 조회해 보겠습니다.

> db.atleastOneMatchDemo.find({"StudentFavouriteSubject":{"$in":["MongoDB","MySQL"]}}).pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cd2db5db64f4b851c3a13ce"),
   "StudentFavouriteSubject" : [
      "MySQL",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd2db71b64f4b851c3a13cf"),
   "StudentFavouriteSubject" : [
      "Java",
      "C",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd2dba9b64f4b851c3a13d1"),
   "StudentFavouriteSubject" : [
      "Ruby",
      "Javascript",
      "C#",
      "MySQL"
   ]
}

결과 분석

$in 연산자는 지정한 값 목록(["MongoDB", "MySQL"]) 중 하나라도 포함되어 있는지를 검사합니다. 따라서 위 결과에서 다음 사실을 확인할 수 있습니다.

  • 첫 번째 문서는 “MySQL”과 “MongoDB” 두 값을 모두 포함하므로 일치합니다.
  • 두 번째 문서는 “MongoDB” 하나만 포함하지만 역시 일치합니다.
  • 네 번째 문서는 “MySQL”만 포함하지만 마찬가지로 일치합니다.
  • 세 번째 문서는 두 값 모두 없으므로 결과에서 제외됩니다.

이처럼 MongoDB에서 배열 필드에 대한 부분 일치 검색이 필요할 때는 $in 연산자가 가장 간단하고 효율적인 해결책입니다. 참고로 인덱스가 설정되어 있다면 $in 쿼리는 해당 인덱스를 활용해 성능을 크게 향상시킬 수 있습니다.