Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 두 필드 값을 비교하는 쿼리 조건 작성 방법

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를 사용하는 것이 좋습니다.