MongoDB 첫 번째 수준 배열에서의 조건 검색
MongoDB에서 문서 내 최상위(첫 번째 수준) 배열을 조건으로 검색할 때는 $elemMatch 대신 $in 연산자를 사용하는 것이 좋습니다. $elemMatch는 주로 객체가 포함된 중첩 배열에서 여러 조건을 동시에 만족시키는 경우에 유용하지만, 단순한 값 배열이라면 $in이 더 간결하고 효율적입니다.
기본 문법은 다음과 같습니다.
db.yourCollectionName.find({yourFieldName:{$in:["yourValue"]}}).pretty();1단계: 샘플 컬렉션 생성
먼저 문서를 포함하는 컬렉션을 생성해 보겠습니다.
> db.firstLevelArrayDemo.insertOne({"StudentName":"Chris","StudentTechnicalSkills":["MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2360f66324ffac2a7dc71")
}
> db.firstLevelArrayDemo.insertOne({"StudentName":"Robert","StudentTechnicalSkills":["C","Java","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2362766324ffac2a7dc72")
}위 명령은 학생 이름과 기술 스킬 목록을 담은 두 개의 문서를 firstLevelArrayDemo 컬렉션에 삽입합니다.
2단계: 전체 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 출력합니다.
> db.firstLevelArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca2360f66324ffac2a7dc71"),
"StudentName" : "Chris",
"StudentTechnicalSkills" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}
{
"_id" : ObjectId("5ca2362766324ffac2a7dc72"),
"StudentName" : "Robert",
"StudentTechnicalSkills" : [
"C",
"Java",
"C++"
]
}3단계: 최상위 배열 조건 매칭 쿼리 실행
이제 $in 연산자를 사용하여 최상위 배열에서 특정 값을 가진 문서만 조회해 보겠습니다.
> db.firstLevelArrayDemo.find({StudentTechnicalSkills:{$in:["MongoDB"]}}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca2360f66324ffac2a7dc71"),
"StudentName" : "Chris",
"StudentTechnicalSkills" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}정리
$in 연산자를 활용하면 배열 필드에 특정 값이 포함되어 있는지 손쉽게 확인할 수 있습니다. 위 예제에서는 StudentTechnicalSkills 배열에 "MongoDB"가 포함된 Chris의 문서만 정확히 필터링되어 반환된 것을 확인할 수 있습니다. 참고로 여러 값을 동시에 검색하려면 {$in:["MongoDB", "MySQL"]}처럼 배열 안에 값을 추가하면 됩니다.