MongoDB에서 컬렉션의 문서를 조회할 때 하나의 필드만이 아니라 여러 필드에 대한 조건을 조합해서 검색해야 하는 경우가 자주 발생합니다. 이럴 때는 find() 메서드와 함께 $or 연산자를 사용하면 간단하게 해결할 수 있습니다.
1. 테스트 데이터 준비하기
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다.
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Robert","IsMarried":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd1e2cba06f46efe9ef1")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Chris","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd322cba06f46efe9ef2")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"David","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd3b2cba06f46efe9ef3")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Carol","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd452cba06f46efe9ef4")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.findDocumentWithFilterDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd4fd1e2cba06f46efe9ef1"),
"ClientName" : "Robert",
"IsMarried" : false
}
{
"_id" : ObjectId("5cd4fd322cba06f46efe9ef2"),
"ClientName" : "Chris",
"IsMarried" : true
}
{
"_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"),
"ClientName" : "David",
"IsMarried" : true
}
{
"_id" : ObjectId("5cd4fd452cba06f46efe9ef4"),
"ClientName" : "Carol",
"IsMarried" : true
}3. $or 연산자로 여러 필드 조건 필터링하기
이제 핵심인 $or 연산자를 활용한 쿼리입니다. 아래 예제는 ClientName이 'Robert'가 아니거나, IsMarried가 false가 아닌 문서를 조회합니다. 즉, 두 조건 중 하나라도 만족하는 모든 문서가 결과에 포함됩니다.
> db.findDocumentWithFilterDemo.find({ $or: [ { "ClientName": { $ne:"Robert" } }, { "IsMarried": { $ne: false } } ] });실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd4fd322cba06f46efe9ef2"), "ClientName" : "Chris", "IsMarried" : true }
{ "_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"), "ClientName" : "David", "IsMarried" : true }
{ "_id" : ObjectId("5cd4fd452cba06f46efe9ef4"), "ClientName" : "Carol", "IsMarried" : true }정리
$or 연산자는 배열 형태로 여러 조건을 받아, 그중 하나라도 참인 문서를 반환합니다. 위 예제에서 'Robert'는 ClientName 조건은 만족하지 않지만($ne:"Robert" 실패) IsMarried가 false이므로 두 번째 조건도 만족하지 않아 결과에서 제외되었습니다. 반면 Chris, David, Carol은 조건 중 하나 이상을 충족하므로 정상적으로 조회된 것입니다.
이처럼 $or와 비교 연산자($ne, $eq, $gt 등)를 조합하면 복잡한 다중 필드 필터링도 손쉽게 구현할 수 있습니다.