MongoDB에서 여러 필드에 걸쳐 여러 값 검색하기
MongoDB에서 여러 필드에 포함된 여러 값을 한 번에 검색하려면 $text 연산자와 $search 연산자를 함께 사용하면 됩니다. 이 방식은 특정 문자열이 문서 내 어느 필드에 있더라도 해당 문서를 찾아주기 때문에, 복합 조건 검색에 매우 유용합니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.searchMultipleFieldsDemo.insertOne({"_id":100,"FirstSubject":"Java","SecondSubject":"MongoDB"});
{ "acknowledged" : true, "insertedId" : 100 }
> db.searchMultipleFieldsDemo.insertOne({"_id":101,"FirstSubject":"MongoDB","SecondSubject":"MySQL"});
{ "acknowledged" : true, "insertedId" : 101 }
> db.searchMultipleFieldsDemo.insertOne({"_id":102,"FirstSubject":"MySQL","SecondSubject":"Java"});
{ "acknowledged" : true, "insertedId" : 102 }저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.searchMultipleFieldsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }$text 검색을 위한 사전 준비: 텍스트 인덱스 생성
$text 연산자를 사용하려면 반드시 해당 컬렉션에 텍스트 인덱스(text index)가 먼저 생성되어 있어야 합니다. 인덱스가 없으면 에러가 발생하므로, 아래와 같이 createIndex()로 검색 대상 필드를 지정해 주세요.
> db.searchMultipleFieldsDemo.createIndex({ FirstSubject: "text", SecondSubject: "text" });여러 필드에서 여러 값 검색하기
텍스트 인덱스 생성이 완료되면, 이제 $text와 $search 연산자를 사용해 여러 필드에서 여러 값을 동시에 검색할 수 있습니다. 아래 예제는 'Java' 또는 'MongoDB'라는 값이 포함된 모든 문서를 조회합니다.
> db.searchMultipleFieldsDemo.find({"$text":{"$search":"Java MongoDB"}});실행 결과는 다음과 같습니다.
{ "_id" : 102, "FirstSubject" : "MySQL", "SecondSubject" : "Java" }
{ "_id" : 100, "FirstSubject" : "Java", "SecondSubject" : "MongoDB" }
{ "_id" : 101, "FirstSubject" : "MongoDB", "SecondSubject" : "MySQL" }정리
$search에 공백으로 구분된 여러 단어를 전달하면 MongoDB는 OR 조건처럼 동작하여, 각 단어 중 하나라도 포함된 문서를 모두 반환합니다. 즉, 'Java'만 포함된 문서, 'MongoDB'만 포함된 문서, 두 값이 모두 포함된 문서까지 모두 검색됩니다. 만약 정확한 문구로 검색하고 싶다면 큰따옴표로 묶어 "$search": "\"Java\"" 형태로 지정할 수 있습니다. 이처럼 $text와 $search 연산자를 활용하면 복잡한 다중 필드 검색도 간단한 쿼리 하나로 처리할 수 있습니다.