MongoDB에서 배열에 포함된 여러 요소를 동시에 만족하는 문서를 찾고 싶다면 $all 연산자를 사용하면 됩니다.
$all 연산자란?
$all 연산자는 특정 필드의 값이 지정한 모든 요소를 포함하는 배열인 문서만 선택하는 쿼리 연산자입니다. 예를 들어, 과목 목록 배열에서 'MongoDB'와 'C++'가 모두 포함된 문서만 조회할 수 있습니다.
테스트 컬렉션 생성 및 데이터 삽입
먼저 인덱스를 생성하고 샘플 문서들을 삽입해 보겠습니다.
> db.demo668.createIndex({"ListOfSubject":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.demo668.insert({"ListOfSubject":["MySQL","Java","C"]});
WriteResult({ "nInserted" : 1 })
> db.demo668.insert({"ListOfSubject":["MongoDB","Python","C++"]});
WriteResult({ "nInserted" : 1 })
> db.demo668.insert({"ListOfSubject":["C#","Spring","Hibernate","MongoDB"]});
WriteResult({ "nInserted" : 1 })전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo668.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5ea311df04263e90dac943d6"), "ListOfSubject" : [ "MySQL", "Java", "C" ] }
{ "_id" : ObjectId("5ea311e004263e90dac943d7"), "ListOfSubject" : [ "MongoDB", "Python", "C++" ] }
{ "_id" : ObjectId("5ea311e104263e90dac943d8"), "ListOfSubject" : [ "C#", "Spring", "Hibernate", "MongoDB" ] }$all로 배열 일치 조회하기
이제 'MongoDB'와 'C++' 두 요소를 모두 포함하는 문서를 찾는 쿼리입니다.
> db.demo668.find({"ListOfSubject":{ $all:["MongoDB","C++"]}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ea311e004263e90dac943d7"), "ListOfSubject" : [ "MongoDB", "Python", "C++" ] }정리
$all 연산자는 배열 필드에서 여러 조건을 동시에 만족하는 문서를 검색할 때 유용합니다. 세 번째 문서에는 'MongoDB'가 포함되어 있지만 'C++'가 없기 때문에 결과에서 제외되었고, 두 요소를 모두 갖춘 두 번째 문서만 반환된 것을 확인할 수 있습니다. 참고로 $all은 배열 내 요소의 순서나 개수와 무관하게, 지정한 요소들이 모두 존재하기만 하면 해당 문서를 매칭합니다.