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

MongoDB $all 연산자로 요소 순서에 관계없이 배열과 일치하는 문서 조회하기

MongoDB $all 연산자란?

배열 필드에서 요소의 순서에 관계없이 특정 조건과 일치하는 문서를 조회하려면 MongoDB의 $all 연산자를 사용하면 됩니다. $all 연산자는 필드의 값이 지정된 모든 요소를 포함하고 있는 배열일 때 해당 문서를 선택합니다.

샘플 데이터 생성

먼저 demo370이라는 컬렉션을 만들고 두 개의 문서를 삽입해 보겠습니다.

> db.demo370.insertOne(
...    {
...       "Name" : "Chris",
...       "details" : [
...          {
...             "Subject" : "MySQL",
...             "CountryName" : "US"
...          },
...          {
...             "Subject" : "MongoDB",
...             "CountryName" : "UK"
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e57e9892ae06a1609a00af0")
}
> db.demo370.insertOne(
...    {
...       "Name" : "David",
...       "details" : [
...          {
             "Subject" : "Java",
...             "CountryName" : "AUS"
...          },
...          {
...             "Subject" : "Spring",
...             "CountryName" : "UK"
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e57e9972ae06a1609a00af1")
}

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo370.find();

위 명령은 다음과 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5e57e9892ae06a1609a00af0"), "Name" : "Chris", "details" : [
      { "Subject" : "MySQL", "CountryName" : "US" },
      { "Subject" : "MongoDB", "CountryName" : "UK" }
   ]
}
{
   "_id" : ObjectId("5e57e9972ae06a1609a00af1"), "Name" : "David", "details" : [
      { "Subject" : "Java", "CountryName" : "AUS" },
      { "Subject" : "Spring", "CountryName" : "UK" }
   ]
}

요소 순서에 관계없이 배열과 일치하는 문서 조회하기

다음은 details 배열 안에 {Subject: "MySQL", CountryName: "US"}와 {Subject: "MongoDB", CountryName: "UK"} 두 요소가 모두 포함된 문서를 조회하는 쿼리입니다. 이때 배열 내 요소의 순서는 중요하지 않습니다.

> db.demo370.find({
...    details: {$all: [
...    {Subject:"MySQL","CountryName" : "US"},
...    {Subject:"MongoDB", "CountryName" : "UK"}
...]}})

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

{
   "_id" : ObjectId("5e57e9892ae06a1609a00af0"), "Name" : "Chris", "details" : [
      { "Subject" : "MySQL", "CountryName" : "US" },
      { "Subject" : "MongoDB", "CountryName" : "UK" }
   ]
}

주요 포인트 정리

  • $all 연산자는 배열 내 요소의 순서를 고려하지 않고, 지정된 모든 요소가 포함된 문서만 반환합니다.
  • 내장 문서(서브 도큐먼트)를 비교할 때는 완전 일치(exact match) 기준으로 평가되므로, Subject와 CountryName처럼 모든 필드가 동일해야 매칭됩니다.
  • 조건 중 하나라도 충족되지 않으면 해당 문서는 결과에서 제외됩니다. 예제에서 David의 문서는 MySQL/MongoDB 조건이 없기 때문에 조회되지 않았습니다.