MongoDB에서는 배열 형태로 저장된 필드의 값을 간단하게 조회할 수 있습니다. 배열 필드 이름(arrayFieldName)과 찾고자 하는 값을 함께 지정하면, MongoDB가 자동으로 배열 내부의 요소를 검색하여 일치하는 문서를 반환합니다.
샘플 컬렉션 생성하기
먼저 문서를 포함하는 컬렉션을 생성해 보겠습니다.
> db.demo295.insertOne({"status":["Active","Inactive"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d4ea65d93261e4bc9ea39")
}
> db.demo295.insertOne({"status":["Yes","No"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d4eb15d93261e4bc9ea3a")
}위 명령은 status라는 배열 필드를 가진 두 개의 문서를 demo295 컬렉션에 삽입합니다.
저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo295.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e4d4ea65d93261e4bc9ea39"),
"status" : [
"Active",
"Inactive"
]
}
{
"_id" : ObjectId("5e4d4eb15d93261e4bc9ea3a"),
"status" : [
"Yes",
"No"
]
}배열 필드 값 쿼리하기
이제 MongoDB에서 객체의 배열 필드 값을 쿼리하는 방법을 살펴보겠습니다. 배열 필드 이름 뒤에 원하는 값을 직접 지정하기만 하면 됩니다.
> db.demo295.find({status:"Inactive"});위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e4d4ea65d93261e4bc9ea39"), "status" : [ "Active", "Inactive" ] }동작 원리
쿼리 조건에 배열 필드와 단일 값을 지정하면, MongoDB는 해당 배열 안에 그 값이 하나라도 포함되어 있는지 검사합니다. 위 예제에서 첫 번째 문서의 status 배열은 ["Active", "Inactive"]이므로 "Inactive" 값이 포함되어 있어 조회 결과에 포함된 것입니다. 반면 두 번째 문서의 배열에는 해당 값이 없기 때문에 결과에서 제외됩니다.
이처럼 별도의 연산자 없이도 배열 요소를 손쉽게 검색할 수 있으며, 더 복잡한 조건이 필요하다면 $in, $all, $elemMatch 같은 배열 연산자를 활용할 수 있습니다.