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

MongoDB에서 컬렉션 필드와 내장 문서 간의 동등성 확인하는 방법

MongoDB에서 최상위 컬렉션의 필드 값과 내장(embedded) 문서 내부의 필드 값을 비교하여 동등성을 확인해야 하는 경우가 있습니다. 이럴 때 $where 연산자를 사용하면 JavaScript 표현식을 통해 두 필드를 직접 비교할 수 있습니다.

테스트용 컬렉션 생성하기

먼저 문서가 포함된 컬렉션을 생성하겠습니다. insertOne() 메서드를 사용하여 두 개의 문서를 삽입합니다.

> db.demo292.insertOne({FirstName:"Chris",LastName:"Brown",
...   "Friend":{FirstName:"David",LastName:"Miller"}
... });
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4c10aa5d93261e4bc9ea30")
}
> db.demo292.insertOne({FirstName:"John",LastName:"Doe",
...   "Friend":{FirstName:"Mike",LastName:"Doe"}
...});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4c10dc5d93261e4bc9ea31")
}

각 문서는 이름(FirstName), 성(LastName) 필드와 함께, 친구 정보를 담고 있는 Friend라는 내장 문서를 가지고 있습니다.

find() 메서드로 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo292.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e4c10aa5d93261e4bc9ea30"), "FirstName" : "Chris", "LastName" : "Brown", "Friend" : { "FirstName" : "David", "LastName" : "Miller" } }
{ "_id" : ObjectId("5e4c10dc5d93261e4bc9ea31"), "FirstName" : "John", "LastName" : "Doe", "Friend" : { "FirstName" : "Mike", "LastName" : "Doe" } }

결과를 보면 첫 번째 문서는 본인의 성이 "Brown", 친구의 성이 "Miller"로 서로 다르고, 두 번째 문서는 본인의 성이 "Doe", 친구의 성도 "Doe"로 일치합니다.

$where 연산자로 동등성 확인하기

컬렉션의 필드와 내장 문서의 필드가 같은지 비교하려면 아래와 같이 $where 연산자에 JavaScript 표현식을 전달합니다.

> db.demo292.find({$where: 'this.Friend.LastName === this.LastName'})

이 쿼리는 this.LastName(문서 자체의 성)와 this.Friend.LastName(내장 문서 안 친구의 성)를 비교하여 두 값이 일치하는 문서만 반환합니다. 실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e4c10dc5d93261e4bc9ea31"), "FirstName" : "John", "LastName" : "Doe", "Friend" : { "FirstName" : "Mike", "LastName" : "Doe" } }

예상대로 본인의 성과 친구의 성이 모두 "Doe"로 일치하는 John Doe의 문서만 조회되었습니다.

참고 사항

$where는 각 문서마다 JavaScript를 실행하기 때문에 성능 비용이 큽니다. 따라서 대량의 데이터를 다루는 운영 환경에서는 사용을 최소화하고, 가능하다면 $expr 연산자와 집계 표현식($eq 등)을 활용하는 것이 좋습니다. 예를 들어 위 쿼리는 다음과 같이 대체할 수 있습니다.

> db.demo292.find({$expr: {$eq: ["$Friend.LastName", "$LastName"]}})

$expr은 인덱스를 활용할 수 있어 $where보다 효율적이므로, MongoDB 3.6 이상 버전을 사용한다면 우선적으로 고려해 보시기 바랍니다.