MongoDB에서 배열 필드에 저장된 태그를 기준으로 문서를 조회하고 싶다면 $elemMatch 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 태그 배열이 포함된 컬렉션을 만들고, 다양한 방식으로 원하는 문서를 조회하는 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 생성하고 태그 배열을 가진 문서들을 삽입합니다.
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-1", "Tag-2", "Tag-3"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d5d628fa4220163b79")
}
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-2", "Tag-4", "Tag-5"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d5d628fa4220163b7a")
}
> db.getDocumentsByTagsDemo.insertOne({"Tags":["Tag-6", "Tag-4", "Tag-3"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb4d6d628fa4220163b7b")
}2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.getDocumentsByTagsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b79"),
"Tags" : [
"Tag-1",
"Tag-2",
"Tag-3"
]
}
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}
{
"_id" : ObjectId("5c9eb4d6d628fa4220163b7b"),
"Tags" : [
"Tag-6",
"Tag-4",
"Tag-3"
]
}3. $elemMatch로 특정 태그가 포함된 문서 조회
$elemMatch 연산자는 배열 내 요소가 지정한 조건과 일치하는지 검사할 때 사용됩니다. 아래 쿼리는 Tags 배열 안에 "Tag-2"가 포함된 모든 문서를 반환합니다.
> db.getDocumentsByTagsDemo.find({Tags: { $elemMatch: { $eq: "Tag-2" } }}).pretty();실행 결과는 다음과 같습니다. "Tag-2"를 포함한 두 개의 문서만 조회된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b79"),
"Tags" : [
"Tag-1",
"Tag-2",
"Tag-3"
]
}
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}4. 더 간단한 방법 – 직접 값 비교
배열 필드에서 단일 값을 찾는 경우라면 $elemMatch 없이 필드 이름에 값을 직접 지정해도 동일한 결과를 얻을 수 있습니다. MongoDB는 배열 필드에 대한 단순 일치 조건을 자동으로 처리하기 때문입니다.
> db.getDocumentsByTagsDemo.find({Tags: "Tag-5"}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9eb4d5d628fa4220163b7a"),
"Tags" : [
"Tag-2",
"Tag-4",
"Tag-5"
]
}정리
태그처럼 배열 형태로 저장된 데이터를 조회할 때는 상황에 맞는 방법을 선택하면 됩니다. 단순히 하나의 값이 배열에 포함되어 있는지만 확인하려면 {Tags: "Tag-5"}처럼 간결하게 작성할 수 있고, 여러 조건을 하나의 배열 요소에 동시에 적용해야 하는 복잡한 경우에는 $elemMatch를 사용하는 것이 좋습니다. 또한 태그 조회 성능을 높이고 싶다면 해당 배열 필드에 인덱스를 생성하는 것도 고려해 보세요.