MongoDB에서 배열 필드에 여러 값이 모두 포함된 문서를 조회하려면 $all 연산자를 사용하면 됩니다. 이 연산자는 지정한 모든 요소가 배열 안에 존재하는 경우에만 해당 문서를 반환합니다.
테스트용 컬렉션 생성하기
개념을 이해하기 위해 먼저 샘플 문서가 담긴 컬렉션을 만들어 보겠습니다. 아래 쿼리는 학생 정보와 전공 과목 배열을 포함한 컬렉션을 생성합니다.
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith",
"StudentCoreSubject":["Compiler","Operating System","Computer Networks"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef07b559dd2396bcfbfc4")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"Carol","StudentLastName":"Taylor",
"StudentCoreSubject":["MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef09d559dd2396bcfbfc5")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"Bob","StudentLastName":"Taylor",
"StudentCoreSubject":["MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef0c7559dd2396bcfbfc6")
}
> db.findByMultipleArrayDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Johnson",
"StudentCoreSubject":["Compiler","Operating System","Computer Networks"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef0f2559dd2396bcfbfc7")
}저장된 전체 문서 확인하기
find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.findByMultipleArrayDemo.find().pretty();
실행 결과는 다음과 같습니다. 총 4개의 문서가 저장되어 있으며, 각 문서는 서로 다른 전공 과목 배열을 가지고 있습니다.
{
"_id" : ObjectId("5c7ef07b559dd2396bcfbfc4"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}
{
"_id" : ObjectId("5c7ef09d559dd2396bcfbfc5"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor",
"StudentCoreSubject" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}
{
"_id" : ObjectId("5c7ef0c7559dd2396bcfbfc6"),
"StudentFirstName" : "Bob",
"StudentLastName" : "Taylor",
"StudentCoreSubject" : [
"MongoDB",
"MySQL",
"SQL Server"
]
}
{
"_id" : ObjectId("5c7ef0f2559dd2396bcfbfc7"),
"StudentFirstName" : "David",
"StudentLastName" : "Johnson",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}$all 연산자로 여러 배열 항목 조회하기
이제 핵심인 $all 연산자를 사용한 쿼리입니다. 배열 필드에 지정한 값들이 모두 들어 있는 문서만 검색됩니다.
> db.findByMultipleArrayDemo.find({ StudentCoreSubject: { $all: ["Compiler", "Computer Networks"] }}).pretty();위 쿼리는 StudentCoreSubject 배열에 "Compiler"와 "Computer Networks" 두 항목이 모두 포함된 문서만 반환합니다. 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7ef07b559dd2396bcfbfc4"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}
{
"_id" : ObjectId("5c7ef0f2559dd2396bcfbfc7"),
"StudentFirstName" : "David",
"StudentLastName" : "Johnson",
"StudentCoreSubject" : [
"Compiler",
"Operating System",
"Computer Networks"
]
}정리 및 참고 사항
결과를 보면 John과 David 두 명의 학생만 조회되었습니다. Carol과 Bob은 MongoDB, MySQL, SQL Server 과목만 가지고 있어 조건에 맞지 않기 때문입니다.
참고로 $all: ["A", "B"]는 $and 조건과 유사하게 동작하지만, 단일 필드 내 배열 요소를 검사할 때는 $all이 훨씬 간결하고 효율적입니다. 또한 $all에 단일 값을 넘기면 일반 동등(equality) 매칭과 동일한 결과를 얻습니다.