MongoDB에서 배열 필드에 특정 값들이 모두 포함되어 있는지 확인하면서 레코드를 조회해야 하는 경우가 있습니다. 이럴 때는 $all 연산자를 사용하면 됩니다. $all은 지정한 배열의 모든 요소가 대상 배열 안에 존재할 때만 해당 문서를 반환합니다.
1. 샘플 컬렉션 생성하기
먼저 학생의 프로그래밍 스킬 목록을 담은 문서로 컬렉션을 생성해 보겠습니다.
> db.subsetOfAnArrayDemo.insertOne({"StudentProgrammingSkills":
["Java","MongoDB","MySQL","C++","Data Structure","Algorithm","Python","Oracle","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb9d1e1895c4fd159f80804")
}2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.subsetOfAnArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cb9d1e1895c4fd159f80804"),
"StudentProgrammingSkills" : [
"Java",
"MongoDB",
"MySQL",
"C++",
"Data Structure",
"Algorithm",
"Python",
"Oracle",
"SQL Server"
]
}3. $all 연산자로 배열의 하위 집합 조회하기
이제 $all 연산자를 활용해 StudentProgrammingSkills 배열에 'MongoDB'와 'MySQL'이 모두 포함된 문서만 조회해 보겠습니다.
> db.subsetOfAnArrayDemo.find({ StudentProgrammingSkills:
{ $all: [ 'MongoDB', 'MySQL' ] } } ).pretty();조건을 만족하는 문서가 다음과 같이 출력됩니다.
{
"_id" : ObjectId("5cb9d1e1895c4fd159f80804"),
"StudentProgrammingSkills" : [
"Java",
"MongoDB",
"MySQL",
"C++",
"Data Structure",
"Algorithm",
"Python",
"Oracle",
"SQL Server"
]
}참고 사항
$all 연산자는 지정한 값들의 순서와 무관하게 배열 내 포함 여부만 검사합니다. 또한 단일 값을 조회할 때는 $in과 결과가 같지만, 여러 값이 모두 존재해야 하는 조건에는 반드시 $all을 사용해야 합니다.