Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 태그로 문서 조회하기 – $elemMatch 연산자 완벽 가이드

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를 사용하는 것이 좋습니다. 또한 태그 조회 성능을 높이고 싶다면 해당 배열 필드에 인덱스를 생성하는 것도 고려해 보세요.