MongoDB에서 배열 필드에 저장된 요소 개수가 1보다 많은 문서만 골라내고 싶다면 $where 연산자와 자바스크립트의 length 속성을 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 크기를 기준으로 문서를 조회하는 방법을 단계별로 살펴보겠습니다.
기본 문법
배열 크기가 1보다 큰 문서를 조회하려면 아래와 같이 쿼리를 작성합니다.
db.yourCollectionName.find({$where:"this.yourArrayDocumentName.length > 1"}).pretty();예제용 컬렉션 만들기
문법을 이해하기 위해 학생 데이터가 담긴 컬렉션을 먼저 생성해 보겠습니다. 각 문서는 학생 이름과 수강 중인 기술 과목 배열을 포함합니다.
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"Larry","StudentTechnicalSubject":["Java","C","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c4c0c3d5054b766a76a")
}
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"Maxwell","StudentTechnicalSubject":["MongoDB"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c660c3d5054b766a76b")
}
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"David","StudentTechnicalSubject":["MySQL","SQL Server","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c800c3d5054b766a76c")
}총 세 개의 문서가 삽입되었습니다. Larry는 과목 3개, Maxwell은 과목 1개, David는 과목 3개를 수강하고 있습니다.
저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 있는 모든 문서를 확인할 수 있습니다.
> db.arrayLengthGreaterThanOne.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6d6c4c0c3d5054b766a76a"),
"StudentName" : "Larry",
"StudentTechnicalSubject" : [
"Java",
"C",
"C++"
]
}
{
"_id" : ObjectId("5c6d6c660c3d5054b766a76b"),
"StudentName" : "Maxwell",
"StudentTechnicalSubject" : [
"MongoDB"
]
}
{
"_id" : ObjectId("5c6d6c800c3d5054b766a76c"),
"StudentName" : "David",
"StudentTechnicalSubject" : [
"MySQL",
"SQL Server",
"PL/SQL"
]
}$where로 배열 크기가 1보다 큰 문서 조회하기
이제 본격적으로 배열 요소가 2개 이상인 문서만 조회해 보겠습니다. 아래 쿼리는 StudentTechnicalSubject 배열의 길이가 1보다 큰 모든 문서를 반환합니다.
> db.arrayLengthGreaterThanOne.find({$where:"this.StudentTechnicalSubject.length > 1"}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6d6c4c0c3d5054b766a76a"),
"StudentName" : "Larry",
"StudentTechnicalSubject" : [
"Java",
"C",
"C++"
]
}
{
"_id" : ObjectId("5c6d6c800c3d5054b766a76c"),
"StudentName" : "David",
"StudentTechnicalSubject" : [
"MySQL",
"SQL Server",
"PL/SQL"
]
}결과를 보면 과목이 하나뿐이었던 Maxwell의 문서는 제외되고, 배열에 두 개 이상의 과목을 가진 Larry와 David의 문서만 출력된 것을 확인할 수 있습니다.
참고: 성능을 고려한 대안 ($expr + $size)
$where는 각 문서마다 자바스크립트를 실행하기 때문에 대량의 데이터를 다룰 때 성능 저하가 발생할 수 있습니다. MongoDB 3.6 이상을 사용한다면 인덱스를 활용할 수 있고 더 효율적인 $expr 연산자와 $size 연산자 조합을 권장합니다.
> db.arrayLengthGreaterThanOne.find({
$expr: { $gt: [ { $size: "$StudentTechnicalSubject" }, 1 ] }
}).pretty();이 쿼리는 앞선 $where 예제와 동일한 결과를 반환하지만, 자바스크립트 실행 없이 집계 표현식으로 처리되므로 대규모 컬렉션에서 더 나은 성능을 기대할 수 있습니다.
정리
- 배열 크기 조건 조회에는 $where와 length 속성을 사용할 수 있습니다.
- $where는 문서마다 자바스크립트를 실행하므로 소규모 데이터나 간단한 테스트에 적합합니다.
- 대량 데이터 환경에서는 $expr과 $size를 조합한 방식이 성능 면에서 유리합니다.