동일한 배열 요소와 일치하는 문서를 찾으려면 find() 메서드 안에서 $all 연산자를 사용하면 됩니다. $all 연산자는 특정 필드의 값이 배열이고, 해당 배열에 지정된 모든 요소가 포함되어 있는 문서만 선택합니다.
1. 샘플 데이터 생성
먼저 문서가 담긴 컬렉션을 만들어 보겠습니다.
> db.demo543.insertOne({id:101, subject:["MySQL", "Java" ,"C","Python"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8e1b2f9e5f92834d7f05c9")
}
> db.demo543.insertOne({id:102, subject:["MySQL", "MongoDB" ,"SQL Server"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e8e1b2f9e5f92834d7f05ca")
}위 예제에서는 두 개의 문서를 삽입했습니다. 첫 번째 문서(id: 101)는 4개의 과목을, 두 번째 문서(id: 102)는 3개의 과목을 배열로 가지고 있습니다.
2. 컬렉션의 전체 문서 조회
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo543.find();
위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e8e1b2f9e5f92834d7f05c9"), "id" : 101, "subject" : [ "MySQL", "Java", "C", "Python" ] }
{ "_id" : ObjectId("5e8e1b2f9e5f92834d7f05ca"), "id" : 102, "subject" : [ "MySQL", "MongoDB", "SQL Server" ] }3. $all 연산자로 배열 요소 매칭하기
다음은 MongoDB에서 동일한 배열 요소와 일치하는 문서를 찾는 쿼리입니다. 여기서는 $all 연산자와 함께 $size 연산자를 조합하여, 지정된 요소들을 모두 포함하면서 배열의 길이까지 정확히 일치하는 문서만 조회합니다.
> db.demo543.find({
... "subject": { $all: [ "MySQL", "MongoDB", "SQL Server"], $size: 3 }
... })이 쿼리는 "MySQL", "MongoDB", "SQL Server" 세 가지 요소를 모두 포함하고, 배열의 크기가 정확히 3인 문서만 반환합니다. 따라서 첫 번째 문서처럼 추가적인 요소("Java", "C", "Python")를 가진 배열은 제외됩니다.
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e8e1b2f9e5f92834d7f05ca"), "id" : 102, "subject" : [ "MySQL", "MongoDB", "SQL Server" ] }정리
$all 연산자만 사용하면 지정된 요소를 모두 포함하는 문서가 반환되지만, 배열에 다른 요소가 더 있어도 매칭됩니다. 반면 $size 연산자를 함께 사용하면 배열의 구성 요소가 정확히 일치하는 문서만 필터링할 수 있어, 보다 엄격한 조건 검색이 가능합니다.