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

MongoDB에서 특정 필드만 포함하는 엄격한 문서 찾기 – $where 연산자 활용법

MongoDB에서 고정된 필드 구성을 가진 문서 조회하기

MongoDB에서 특정 필드들만 정확히 포함하고 있는, 즉 필드 개수가 고정된 엄격한 형태의 문서를 찾고 싶다면 $where 연산자를 활용할 수 있습니다. $where 연산자는 자바스크립트 함수를 사용해 각 문서를 조건에 맞게 검사할 수 있어서, 일반적인 쿼리 연산자로는 표현하기 어려운 복잡한 조건도 처리할 수 있습니다.

먼저 예제 컬렉션을 생성하고 몇 개의 문서를 삽입해 보겠습니다.

1. 샘플 데이터 준비

> db.veryStrictDocumentDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe","StudentAge":23});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4bcdb50a6c6dd317adb8")
}
> db.veryStrictDocumentDemo.insertOne({"StudentFirstName":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4bdbb50a6c6dd317adb9")
}
> db.veryStrictDocumentDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4becb50a6c6dd317adba")
}
> db.veryStrictDocumentDemo.insertOne({"StudentFirstName":"Chris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4bfbb50a6c6dd317adbb")
}
> db.veryStrictDocumentDemo.insertOne({"StudentFirstName":"Bob","StudentLastName":"Brown"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4c6db50a6c6dd317adbc")
}

위 코드에서는 학생 이름, 성, 나이 등 서로 다른 필드 조합을 가진 5개의 문서를 삽입했습니다. 일부 문서는 3개의 필드를, 일부는 2개의 필드만 가지고 있습니다.

2. 전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.

> db.veryStrictDocumentDemo.find();

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

{ "_id" : ObjectId("5cda4bcdb50a6c6dd317adb8"), "StudentFirstName" : "John", "StudentLastName" : "Doe", "StudentAge" : 23 }
{ "_id" : ObjectId("5cda4bdbb50a6c6dd317adb9"), "StudentFirstName" : "Larry" }
{ "_id" : ObjectId("5cda4becb50a6c6dd317adba"), "StudentFirstName" : "David", "StudentLastName" : "Miller" }
{ "_id" : ObjectId("5cda4bfbb50a6c6dd317adbb"), "StudentFirstName" : "Chris" }
{ "_id" : ObjectId("5cda4c6db50a6c6dd317adbc"), "StudentFirstName" : "Bob", "StudentLastName" : "Brown" }

3. $where 연산자로 고정 길이 필드 문서 조회하기

이제 핵심 부분입니다. StudentFirstName과 StudentLastName 필드가 반드시 존재하고, 동시에 전체 필드 개수가 정확히 4개( _id 포함)인 문서만 조회하는 쿼리입니다.

> db.veryStrictDocumentDemo.find({
   "StudentFirstName": { $exists: true },
   "StudentLastName": { $exists: true },
   $where: function() { return Object.keys(this).length === 4 }
});

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

{ "_id" : ObjectId("5cda4bcdb50a6c6dd317adb8"), "StudentFirstName" : "John", "StudentLastName" : "Doe", "StudentAge" : 23 }

쿼리 동작 원리 이해하기

이 쿼리가 어떻게 작동하는지 살펴보겠습니다.

$exists 조건: StudentFirstName과 StudentLastName 필드가 실제로 존재하는지 먼저 확인합니다. 이렇게 하면 $where 함수가 실행되기 전에 불필요한 문서를 걸러낼 수 있습니다.

$where 함수: Object.keys(this).length === 4 조건은 현재 문서(this)의 모든 키 개수를 세어 정확히 4개인 경우에만 true를 반환합니다. 여기서 4개의 키는 _id, StudentFirstName, StudentLastName, 그리고 하나의 추가 필드(StudentAge)를 의미합니다.

결과적으로 John Doe의 문서만 반환되었습니다. 이 문서는 이름과 성이 모두 존재하면서, 나이 필드까지 포함해 총 4개의 필드를 가진 유일한 문서이기 때문입니다. 나머지 문서들은 필드 개수가 3개 미만이거나 필수 필드가 누락되어 결과에서 제외되었습니다.

주의사항

$where 연산자는 자바스크립트를 실행하기 때문에 다른 쿼리 연산자보다 성능이 떨어질 수 있습니다. 따라서 가능하면 인덱스를 활용하는 일반 쿼리와 함께 사용하고, $where는 최종 필터링 용도로 사용하는 것이 좋습니다. 또한 대량의 데이터를 다루는 운영 환경에서는 스키마 검증(schema validation)을 도입해 애초에 필드 구성을 강제하는 방법도 고려해 볼 만합니다.