MongoDB에서 $or 연산자는 여러 조건 중 하나라도 참인 문서를 조회할 때 사용하는 논리 연산자입니다. 이 글에서는 실제 예제를 통해 $or 조건이 포함된 쿼리를 단계별로 작성하고, 실행 결과를 함께 확인해 보겠습니다.
컬렉션 생성 및 문서 삽입
$or 조건이 포함된 쿼리를 이해하기 위해 먼저 문서가 담긴 컬렉션을 생성하겠습니다. insertOne() 메서드를 사용해 고객 이름(CustomerName)과 배송 날짜(ShippingDate)를 저장합니다.
> db.orConditionDemo.insertOne({"CustomerName":"Larry","ShippingDate":new ISODate("2018-01-29")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5262f684a30fbdfd56a")
}
> db.orConditionDemo.insertOne({"CustomerName":"Mike","ShippingDate":new ISODate("2019-04-13")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5362f684a30fbdfd56b")
}
> db.orConditionDemo.insertOne({"CustomerName":"Bob","ShippingDate":new ISODate("2019-02-21")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5422f684a30fbdfd56c")
}
> db.orConditionDemo.insertOne({"CustomerName":"David","ShippingDate":new ISODate("2019-03-15")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec5532f684a30fbdfd56d")
}
> db.orConditionDemo.insertOne({"CustomerName":"John","ShippingDate":new ISODate("2019-03-19")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec56c2f684a30fbdfd56e")
}
위 명령을 실행하면 총 5개의 문서가 orConditionDemo 컬렉션에 순차적으로 저장됩니다.
전체 문서 조회하기
find() 메서드에 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.orConditionDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8ec5262f684a30fbdfd56a"),
"CustomerName" : "Larry",
"ShippingDate" : ISODate("2018-01-29T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5362f684a30fbdfd56b"),
"CustomerName" : "Mike",
"ShippingDate" : ISODate("2019-04-13T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5422f684a30fbdfd56c"),
"CustomerName" : "Bob",
"ShippingDate" : ISODate("2019-02-21T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec5532f684a30fbdfd56d"),
"CustomerName" : "David",
"ShippingDate" : ISODate("2019-03-15T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec56c2f684a30fbdfd56e"),
"CustomerName" : "John",
"ShippingDate" : ISODate("2019-03-19T00:00:00Z")
}
$or 조건을 적용한 쿼리 실행
이제 여러 개의 $or 조건을 결합한 쿼리를 실행해 보겠습니다. 아래 쿼리는 배송 날짜(ShippingDate)가 현재 시점 이후인 문서 또는 배송 날짜가 null인 문서를 모두 반환합니다.
> db.orConditionDemo.find({$or: [{ShippingDate: {$gte: new ISODate()}}, {ShippingDate: null}]}).pretty();
쿼리 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8ec5362f684a30fbdfd56b"),
"CustomerName" : "Mike",
"ShippingDate" : ISODate("2019-04-13T00:00:00Z")
}
{
"_id" : ObjectId("5c8ec56c2f684a30fbdfd56e"),
"CustomerName" : "John",
"ShippingDate" : ISODate("2019-03-19T00:00:00Z")
}
결과 분석
결과에는 Mike와 John의 문서만 포함되어 있습니다. 두 문서의 배송 날짜는 각각 2019년 4월 13일과 3월 19일로, 쿼리 실행 당시의 현재 날짜보다 이후($gte)이기 때문에 첫 번째 조건을 만족합니다. 반면 Larry, Bob, David의 문서는 배송 날짜가 이미 지났고 null도 아니므로 두 조건 어디에도 해당하지 않아 결과에서 제외되었습니다.
이처럼 MongoDB의 $or 연산자를 활용하면 서로 다른 조건을 하나의 쿼리로 결합하여, 조건 중 하나라도 만족하는 문서를 손쉽게 조회할 수 있습니다.