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

MongoDB에서 한 필드에 연산을 수행하면서 두 필드를 비교하는 방법

MongoDB에서 $where로 두 필드 비교하기

MongoDB에서 두 필드의 값을 비교할 때는 $where 연산자를 사용합니다. 일반적인 쿼리 연산자로는 서로 다른 두 필드를 직접 비교할 수 없기 때문에, JavaScript 표현식을 실행할 수 있는 $where가 유용하게 활용됩니다.

1. 샘플 컬렉션 생성

먼저 문서를 포함하는 컬렉션을 생성해 보겠습니다.

> db.demo7.insertOne({"FirstName1":"JOHN","FirstName2":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0ccd1a25ddae1f53b6222f")
}
> db.demo7.insertOne({"FirstName1":"Carol","FirstName2":"Mike"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0ccd2725ddae1f53b62230")
}
> db.demo7.insertOne({"FirstName1":"bob","FirstName2":"BOB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0ccd3225ddae1f53b62231")
}

위 예제에서는 세 개의 문서를 삽입했습니다. 첫 번째와 세 번째 문서는 대소문자만 다를 뿐 이름이 동일하고, 두 번째 문서는 완전히 다른 이름을 가지고 있습니다.

2. 전체 문서 조회하기

find() 메서드를 사용해 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.demo7.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e0ccd1a25ddae1f53b6222f"), "FirstName1" : "JOHN", "FirstName2" : "John" }
{ "_id" : ObjectId("5e0ccd2725ddae1f53b62230"), "FirstName1" : "Carol", "FirstName2" : "Mike" }
{ "_id" : ObjectId("5e0ccd3225ddae1f53b62231"), "FirstName1" : "bob", "FirstName2" : "BOB" }

3. $where로 두 필드 비교하기

이제 한쪽 필드에 toLowerCase() 연산을 수행하면서 두 필드를 비교하는 쿼리를 살펴보겠습니다. 이 방식은 대소문자 구분 없이 두 필드의 값이 같은지 확인할 수 있습니다.

> db.demo7.find({$where: "this.FirstName1.toLowerCase() == this.FirstName2.toLowerCase()"});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e0ccd1a25ddae1f53b6222f"), "FirstName1" : "JOHN", "FirstName2" : "John" }
{ "_id" : ObjectId("5e0ccd3225ddae1f53b62231"), "FirstName1" : "bob", "FirstName2" : "BOB" }

결과 분석

결과를 보면 첫 번째 문서(JOHN vs John)와 세 번째 문서(bob vs BOB)만 반환되었습니다. 두 문서 모두 소문자로 변환했을 때 값이 일치하기 때문입니다. 반면 두 번째 문서(Carol vs Mike)는 값이 다르므로 결과에서 제외되었습니다.

$where 사용 시 주의사항

$where는 각 문서마다 JavaScript를 실행하므로 성능상 비용이 큽니다. 따라서 다음 사항을 고려하는 것이 좋습니다.

- 가능하면 인덱스를 활용할 수 있는 일반 쿼리 조건과 함께 사용하여 검색 범위를 줄이세요.
- 대량의 컬렉션에서 무분별하게 사용하면 쿼리 속도가 크게 저하될 수 있습니다.
- 집계 파이프라인의 $expr 또는 $match 단계를 활용하면 더 효율적으로 처리할 수 있는 경우도 있습니다.