MongoDB에서 find()를 사용하여 원하는 문서를 검색할 때 하나의 필드가 아닌 여러개의 필드 안에서 값을 찾는 방법에 대하여 알아봅니다.

예를들어 만약 webisfree라는 키워드를 mongodb에서 검색하고자 할때 제목뿐만 아니라 본문과 태그에서도 검색되도록 하기 위해서 여러개의 컬럼에서 검색이 되도록 하려면 쿼리문을 어떻게 작성하면 될까요?



! $or를 사용하여 여러개의 컬럼에서 찾기
이때 사용 가능한 방법이 바로 $or를 사용하는 방법입니다. 즉 쿼리에 or 조건을 사용해 여러개의 컬럼에서 모두 검색할 수 있겠죠. 만약 아래와 같이 데이터가 MongoDB에 존재하는 경우를 생각해봅니다.


@ Collection: website
{
  title: '웹이즈프리',
  content: 'Hello, Hi, Good morning.',
  url: 'webisfree.com'
},
...

만약 title에서 'webisfree.com'를 찾기 위해서는 아래와 같이 쿼리문을 사용할 것입니다. 
db.website.find({ title: 'webisfree.com' });


// 검색 결과 없음

title에는 webisfree.com라는 텍스트가 없으므로 찾을 수 없습니다. 여기서 title 뿐만 아니라 content, url 등의 컬럼 모두 찾으려면 아래와 같이 $or을 사용하여 쿼리문을 사용할 수 있습니다.
db.website.find({
  $or: [
    title: 'webisfree.com',
    content: 'webisfree.com',
    url: 'webisfree.com'
  ]
});


// 검색 결과 1개의 일치하는 row 찾음

첫 번째 쿼리와 달리 아래에서는 url에 포함된 일치하는 텍스트를 찾아 해당하는 row를 반환하게 됩니다. 이처럼 $or을 사용하여 여러개의 조건을 사용할 수 있으므로 멀티 컬럼에서 검색하기 위해 사용할 수 있습니다.


! $or에 정규표현식으로 사용하기
추가로 위 예제는 쿼리를 이렇게 사용한다는 예제로서는 적합하지만 실제로 검색어를 찾는 경우 일치하지 않는 키워드가 포함된 경우를 결과로 반환해야 합니다. 즉 위 예제와 달리 실제 사용할 앱을 만드는 경우 정규표현식을 사용하여 검색 입력폼을 구현하므로 아래처럼 $regex를 사용하도록 쿼리를 변경하는 것을 생각할 수 있습니다.
db.website.find({
  $or: [
    title: {'$webisfree.com': 'apple', '$options': 'i'} },
    content: {'$webisfree.com': 'apple', '$options': 'i'} },
    url: {'$webisfree.com': 'apple', '$options': 'i'} }
  ]
});

이제 정확히 일치하지 않더라도 안에 포함된 경우에는 해당 row를 반환하게 됩니다.


여기가지 여러개의 MongoDB 컬럼 영역에서 검색어를 찾는 방법에 대하여 간단하게 알아보았습니다.