MongoDB에서 배열 필드에 대해 AND 조건으로 쿼리를 실행하려면 $all 연산자를 사용하면 됩니다. $all은 지정한 모든 값이 배열 안에 동시에 포함되어 있는 문서만 반환합니다. 먼저 예제에 사용할 컬렉션과 문서를 생성해 보겠습니다.
> db.andQueryDemo.insertOne({"StudentName":"Carol Taylor","FavouriteSubject":["C","Java","MongoDB","MySQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc73e7a8f9e6ff3eb0ce433")
}
> db.andQueryDemo.insertOne({"StudentName":"David Miller","FavouriteSubject":["C++","Java","MongoDB","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc73ea48f9e6ff3eb0ce434")
}
> db.andQueryDemo.insertOne({"StudentName":"Carol Taylor","FavouriteSubject":["Python","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc73ed38f9e6ff3eb0ce435")
}
컬렉션의 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.andQueryDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5cc73e7a8f9e6ff3eb0ce433"),
"StudentName" : "Carol Taylor",
"FavouriteSubject" : [
"C",
"Java",
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5cc73ea48f9e6ff3eb0ce434"),
"StudentName" : "David Miller",
"FavouriteSubject" : [
"C++",
"Java",
"MongoDB",
"SQL Server"
]
}
{
"_id" : ObjectId("5cc73ed38f9e6ff3eb0ce435"),
"StudentName" : "Carol Taylor",
"FavouriteSubject" : [
"Python",
"PL/SQL"
]
}
$all 연산자로 배열 AND 쿼리 실행하기
이제 $all 연산자를 사용하여 FavouriteSubject 배열에 "Java"와 "MongoDB"가 둘 다 포함된 문서만 조회해 보겠습니다.
> db.andQueryDemo.find({FavouriteSubject:{$all:["Java","MongoDB"]}}).pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cc73e7a8f9e6ff3eb0ce433"),
"StudentName" : "Carol Taylor",
"FavouriteSubject" : [
"C",
"Java",
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5cc73ea48f9e6ff3eb0ce434"),
"StudentName" : "David Miller",
"FavouriteSubject" : [
"C++",
"Java",
"MongoDB",
"SQL Server"
]
}
$all 연산자의 동작 원리
$all 연산자는 배열 내 요소의 순서나 개수와 상관없이, 지정한 값들이 모두 존재하는지만 확인합니다. 따라서 "Java"와 "MongoDB"가 배열의 어느 위치에 있더라도 두 값이 모두 포함되어 있다면 해당 문서는 조건에 일치하는 것으로 판단됩니다. 세 번째 문서처럼 두 값 중 하나라도 빠져 있으면 결과에서 제외됩니다. 참고로 $all에 값을 하나만 지정하면 일반적인 동등(equality) 매칭과 동일하게 동작합니다.