MongoDB에서는 $where 연산자와 find() 메서드를 함께 사용하면 두 필드의 값을 서로 비교할 수 있습니다. 일반적인 쿼리 연산자로는 필드와 고정된 값만 비교할 수 있지만, $where를 사용하면 같은 문서 내의 필드끼리 비교하는 조건을 자바스크립트 표현식으로 작성할 수 있습니다.
기본 문법
db.컬렉션명.find({$where:"조건식"}).pretty();예제 컬렉션 생성하기
문법을 이해하기 위해 몇 개의 문서가 담긴 컬렉션을 먼저 만들어 보겠습니다. 아래 쿼리는 'compareTwoFields'라는 컬렉션에 세 개의 문서를 삽입합니다.
> db.compareTwoFields.insert({"Id":1,"FullName":{"FirstName":"John","LastName":"Smith"}, "BranchName":"ComputerScience"});
WriteResult({ "nInserted" : 1 })
> db.compareTwoFields.insert({"Id":2,"FullName":{"FirstName":"Smith","LastName":"Smith"}, "BranchName":"Civil"});
WriteResult({ "nInserted" : 1 })
> db.compareTwoFields.insert({"Id":3,"FullName":{"FirstName":"David","LastName":"Smith"}, "BranchName":"Mechanical"});
WriteResult({ "nInserted" : 1 })저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.compareTwoFields.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6c237568174aae23f5ef64"),
"Id" : 1,
"FullName" : {
"FirstName" : "John",
"LastName" : "Smith"
},
"BranchName" : "ComputerScience"
}
{
"_id" : ObjectId("5c6c239868174aae23f5ef65"),
"Id" : 2,
"FullName" : {
"FirstName" : "Smith",
"LastName" : "Smith"
},
"BranchName" : "Civil"
}
{
"_id" : ObjectId("5c6c23b468174aae23f5ef66"),
"Id" : 3,
"FullName" : {
"FirstName" : "David",
"LastName" : "Smith"
},
"BranchName" : "Mechanical"
}두 필드를 비교하는 쿼리 실행하기
이제 $where 연산자를 사용해 FullName 객체 안에서 FirstName과 LastName이 동일한 문서만 조회해 보겠습니다. this 키워드를 통해 현재 검사 중인 문서에 접근한다는 점이 핵심입니다.
> db.compareTwoFields.find({$where:"this.FullName.FirstName==this.FullName.LastName"}).pretty();실행 결과 FirstName과 LastName이 모두 'Smith'로 일치하는 두 번째 문서(Id: 2)만 반환됩니다.
{
"_id" : ObjectId("5c6c239868174aae23f5ef65"),
"Id" : 2,
"FullName" : {
"FirstName" : "Smith",
"LastName" : "Smith"
},
"BranchName" : "Civil"
}참고 사항
$where 연산자는 각 문서마다 자바스크립트 코드를 실행하기 때문에 인덱스를 활용하지 못하고 성능이 떨어질 수 있습니다. 따라서 대용량 컬렉션에서는 가능한 한 일반 쿼리 연산자나 애그리게이션 파이프라인($expr, $eq 등)을 우선적으로 고려하고, 부득이하게 필드 간 비교가 필요한 경우에만 $where를 사용하는 것이 좋습니다.