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 연산자를 사용하는 더 간결한 방법도 있습니다. 상황에 맞게 선택하여 사용하시면 됩니다.