MongoDB에서 여러 조건을 조합한 중첩(nested) 검색을 수행하려면 $and 연산자와 함께 $or 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 두 연산자를 결합하여 복잡한 조건의 문서를 조회하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. insertOne() 메서드를 사용하여 네 개의 문서를 순차적으로 추가합니다.
> db.demo12.insertOne({"Name":"Chris","Age":23,"CountryName":"US","Message":"Hello"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0f70a2d7df943a7cec4fa2")
}
> db.demo12.insertOne({"Name":"David","Age":21,"CountryName":"US","Message":"Hello"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0f70acd7df943a7cec4fa3")
}
> db.demo12.insertOne({"Name":"Bob","Age":23,"CountryName":"AUS","Message":"Hi"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0f70bad7df943a7cec4fa4")
}
> db.demo12.insertOne({"Name":"Carol","Age":24,"CountryName":"US","Message":"Hi"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0f70c7d7df943a7cec4fa5")
}각 문서는 이름(Name), 나이(Age), 국가(CountryName), 메시지(Message) 필드를 가지고 있습니다.
2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo12.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e0f70a2d7df943a7cec4fa2"), "Name" : "Chris", "Age" : 23, "CountryName" : "US", "Message" : "Hello" }
{ "_id" : ObjectId("5e0f70acd7df943a7cec4fa3"), "Name" : "David", "Age" : 21, "CountryName" : "US", "Message" : "Hello" }
{ "_id" : ObjectId("5e0f70bad7df943a7cec4fa4"), "Name" : "Bob", "Age" : 23, "CountryName" : "AUS", "Message" : "Hi" }
{ "_id" : ObjectId("5e0f70c7d7df943a7cec4fa5"), "Name" : "Carol", "Age" : 24, "CountryName" : "US", "Message" : "Hi" }3. $and와 $or를 조합한 중첩 검색 쿼리
이제 핵심인 중첩 검색 쿼리입니다. 아래 쿼리는 다음 세 가지 조건을 동시에 만족하는 문서를 찾습니다.
- Name이 'Bob'인 경우
- Age가 23인 경우
- CountryName이 'UK'이거나 Message가 'Hi'인 경우 ($or 조건)
> db.demo12.find({ $and : [ { Name : 'Bob' }, { Age : 23 }, { $or : [ { CountryName : 'UK' }, { Message : 'Hi' } ] } ] } );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e0f70bad7df943a7cec4fa4"), "Name" : "Bob", "Age" : 23, "CountryName" : "AUS", "Message" : "Hi" }쿼리 로직 설명
이 쿼리가 어떻게 동작하는지 자세히 분석해 보겠습니다.
- $and 연산자: 배열 안의 모든 조건이 참(true)일 때만 해당 문서를 반환합니다. 즉, Name='Bob' AND Age=23이 반드시 충족되어야 합니다.
- $or 연산자: 배열 안의 조건 중 하나라도 참이면 통과합니다. CountryName='UK' 또는 Message='Hi' 중 하나만 만족하면 됩니다.
결과적으로 Bob은 나이가 23살이고, Message가 'Hi'이므로 $or 조건을 충족하여 최종 결과에 포함되었습니다. CountryName이 'UK'가 아니더라도 Message 조건으로 인해 매칭된 것입니다.
마무리
이처럼 MongoDB에서는 $and와 $or 연산자를 계층적으로 조합하여 SQL의 복잡한 WHERE 절과 유사한 정교한 검색 조건을 구성할 수 있습니다. 실무에서는 사용자 필터링, 대시보드 검색 등 다양한 시나리오에서 이 패턴을 활용할 수 있으니 꼭 익혀두시기 바랍니다.