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

MongoDB 객체 배열에서 두 개의 특정 ID를 가진 문서 찾는 방법 ($and 연산자 활용)

MongoDB에서 배열 형태로 저장된 객체(object) 안에 있는 필드 값을 조건으로 조회해야 하는 경우가 자주 있습니다. 특히 하나의 문서 안에서 두 개 이상의 특정 ID가 모두 존재하는지 확인하고 싶다면, $and 연산자를 활용하면 됩니다.

테스트용 컬렉션 생성하기

먼저 예제로 사용할 컬렉션을 만들고 샘플 문서를 삽입해 보겠습니다. 아래 예제에서는 선수 정보를 담은 PlayerDetails 배열을 포함한 문서 두 개를 생성합니다.

> db.twoSpecificIdsDemo.insertOne(
...   {
...      PlayerId:1,
...      "PlayerDetails": [{
...         id: 100,
...         "PlayerName":"Chris"
...      },{
...         id: 101,
...         "PlayerName":"Sam"
...      },{
...         id: 102,
...         "PlayerName":"Robert"
...      },{
...         id: 103,
...         "PlayerName":"Carol"
...      }]
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd3e130edc6604c74817ce4")
}
> db.twoSpecificIdsDemo.insertOne(
...   {
...      PlayerId:1,
...      "PlayerDetails": [{
...         id: 104,
...         "PlayerName":"Mike"
...      },{
...         id: 105,
...         "PlayerName":"Bob"
...      },{
...         id: 102,
...         "PlayerName":"Ramit"
...      },{
...         id: 106,
...         "PlayerName":"David"
...      }]
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd3e167edc6604c74817ce5")
}

첫 번째 문서에는 ID 100~103이, 두 번째 문서에는 ID 104~106과 102가 포함되어 있습니다. 즉, ID 102는 두 문서 모두에 존재하지만, ID 103은 첫 번째 문서에만 존재합니다.

저장된 전체 문서 조회하기

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

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

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

{
    "_id" : ObjectId("5cd3e130edc6604c74817ce4"),
    "PlayerId" : 1,
    "PlayerDetails" : [
       {
          "id" : 100,
          "PlayerName" : "Chris"
       },
       {
          "id" : 101,
          "PlayerName" : "Sam"
       },
       {
          "id" : 102,
          "PlayerName" : "Robert"
       },
       {
          "id" : 103,
          "PlayerName" : "Carol"
       }
    ]
}
{
    "_id" : ObjectId("5cd3e167edc6604c74817ce5"),
    "PlayerId" : 1,
    "PlayerDetails" : [
       {
          "id" : 104,
          "PlayerName" : "Mike"
       },
       {
          "id" : 105,
          "PlayerName" : "Bob"
       },
       {
          "id" : 102,
          "PlayerName" : "Ramit"
       },
       {
          "id" : 106,
          "PlayerName" : "David"
       }
    ]
}

$and 연산자로 두 개의 특정 ID 조회하기

이제 핵심인 조회 쿼리입니다. 객체 배열 내에서 ID 102와 ID 103을 모두 포함한 문서만 찾으려면 $and 연산자 안에 각 조건을 배열로 나열하면 됩니다.

> db.twoSpecificIdsDemo.find( { $and : [ { "PlayerDetails.id" : 102 }, { "PlayerDetails.id" : 103 } ] } ).pretty();

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

{
    "_id" : ObjectId("5cd3e130edc6604c74817ce4"),
    "PlayerId" : 1,
    "PlayerDetails" : [
       {
          "id" : 100,
          "PlayerName" : "Chris"
       },
       {
          "id" : 101,
          "PlayerName" : "Sam"
       },
       {
          "id" : 102,
          "PlayerName" : "Robert"
       },
       {
          "id" : 103,
          "PlayerName" : "Carol"
       }
    ]
}

결과 분석 및 참고 사항

출력 결과를 보면 첫 번째 문서만 반환된 것을 확인할 수 있습니다. 그 이유는 다음과 같습니다.

  • 첫 번째 문서: ID 102와 103이 모두 존재 → 조건 충족 ✅
  • 두 번째 문서: ID 102는 있지만 103이 없음 → 조건 불충족 ❌

MongoDB에서 점 표기법(PlayerDetails.id)으로 배열 내 객체 필드를 조건으로 지정하면, 해당 배열의 어떤 요소라도 조건과 일치하면 매칭됩니다. 따라서 $and를 사용하면 "배열 전체에서 각각의 조건을 만족하는 요소가 하나 이상씩 존재하는지"를 검사하게 됩니다.

참고로, 동일한 필드에 여러 조건을 적용할 때는 { $and: [...] } 대신 { "PlayerDetails.id": { $all: [102, 103] } }처럼 $all 연산자를 사용하는 더 간결한 방법도 있습니다. 상황에 맞게 선택하여 사용하시면 됩니다.