프로젝트

사전 검색 서비스

syleemomo 2021. 10. 25. 21:32
728x90

 

참고 블로그

 

'프로젝트/할일목록(TODO) 앱' 카테고리의 글 목록

 

syleemomo.tistory.com

해당 프로젝트는 할일목록 앱 프로젝트의 연장선에 있다. 그래서 서버 구조나 서버 설정은 할일목록 앱 프로젝트를 참고하면 된다. 

 

* 모델 구현하기

const mongoose = require('mongoose')

const wordSchema = mongoose.Schema({
    r_seq: { type: String, trim: true },
    r_word: { type: String, trim: true },
    r_link: { type: String, trim: true },
    r_chi: { type: String, trim: true },
    r_des: { type: String, trim: true },
    r_pos: { type: String, trim: true },
})

const Word = mongoose.model('Word', wordSchema, 'kor_dic_coll') 

module.exports = Word;

models 폴더 하위에 Word.js 파일을 생성하고 위의 코드를 작성하자! kor_dic_coll 은 Mongo DB 의 실제 컬렉션 이름이다. 모든 필드가 string 이다. 

 

* API 구현하기

const express = require('express')
const router = express.Router()
const todo = require('./todo')
const word = require('./word') // 코드 추가하기

router.use('/todos', todo)
router.use('/words', word)  // 코드 추가하기

module.exports = router

routes 폴더 하위 index.js 에 코드를 추가하자! /api 의 하위 URL 로 /words 를 추가하고 관련된 라우트 핸들러 모듈을 가져와서 사용한다. 즉, /api/words 가 엔드포인트가 된다. 

const express = require('express')
const WordRouter = express.Router()

const Word = require('../../models/Word')

WordRouter.route('/(:word)?').get( async (req, res) => {
    let words = []
    const { word } = req.params

    if(word !== "undefined" && word !== undefined){ // 검색어가 존재하는 경우
        console.log(word)
        try{
            words = await Word.find({ r_word: word}) // Word 모델의 r_word 필드에서 쿼리와 일치하는 단어 검색
        }catch(e){
            console.log(e)
        }
    }else{  // 검색어가 존재하지 않는 경우
        console.log(word)
        try{
            words = await Word.find() // 데이터베이스에서 전체 단어 검색
        }catch(e){
            console.log(e) 
        }
    }
    res.json({status: 200, words})
})

module.exports = WordRouter

routes 폴더 하위에 word 폴더를 생성하고 그 안에 index.js 파일을 생성하자! 그런 다음 위 코드를 입력하자! 

WordRouter.route('/(:word)?')

우선 정규표현식을 사용하여 word 라는 파라미터를 옵션으로 설정하였다. 즉, word 라는 파라미터는 있어도 되고 없어도 된다. API URL 은 /api/words/ 또는 /api/words/학원 와 같은 형태가 된다. 

let words = []
const { word } = req.params

데이터베이스 조회 결과를 담을 words 변수를 배열로 초기화한다. 사용자로부터 전달받은 URL 파라미터를 저장할 word 를 상수로 선언한다. 

if(word !== "undefined" && word !== undefined){ // 검색어가 존재하는 경우
    console.log(word)
    try{
        words = await Word.find({ r_word: word}) // Word 모델의 r_word 필드에서 쿼리와 일치하는 단어 검색
    }catch(e){
        console.log(e)
    }
}

사용자로부터 전달받은 검색어가 존재하는 경우 도큐먼트의 r_word 필드가 검색어와 일치하는 도큐먼트를 추출한다. 데이터베이스 쿼리를 실행하는 동안 기다리기 위하여 async, await 키워드를 사용하였다. async, await 키워드를 사용할때는 일반적으로 try, catch 문을 사용하여 에러 처리를 한다. 

else{  // 검색어가 존재하지 않는 경우
    console.log(word)
    try{
        words = await Word.find() // 데이터베이스에서 전체 단어 검색
    }catch(e){
        console.log(e) 
    }
}

사용자가 검색어를 입력하지 않은 경우 전체 컬렉션을 조회한다. 

res.json({status: 200, words})

데이터베이스 조회 결과를 클라이언트로 전송한다. 

 

* 데이터베이스 조회에 정규표현식 사용하기

 words = await Word.find({ r_word: { $regex: `^${word}`}}) // Word 모델의 r_word 필드에서 쿼리로 시작하는 단어 검색

검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_word 필드에서 검색어로 시작하는 모든 도큐먼트를 조회한다. 

검색어로 시작하는 도큐먼트 조회 결과

 

words = await Word.find({ r_word: { $regex: `${word}$`}}) // Word 모델의 r_word 필드에서 쿼리로 끝나는 단어 검색

검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_word 필드에서 검색어로 끝나는 모든 도큐먼트를 조회한다. 

words = await Word.find({ r_des: { $regex: `${word}`}}) // Word 모델의 r_des 필드에서 쿼리를 포함하는 단어 검색

검색어가 존재하는 경우 위와 같이 조회해보자! regex 연산자를 사용하여 r_des 필드에서 검색어를 포함하는 모든 도큐먼트를 조회한다. 

단어 설명 부분에서 검색어를 포함하는 도큐먼트 조회 결과

// Word 모델의 r_word 필드와 r_des 필드에서 쿼리를 포함하는 단어 검색
words = await Word.find({ $or: 
  [      
      {r_word: {$regex: `${word}`}},
      {r_des: {$regex: `${word}`}} 
  ]
})

검색어가 존재하는 경우 위와 같이 조회해보자! or 연산자와 regex 연산자를 사용하여 r_word 필드가 검색어를 포함하거나 r_des 필드가 검색어를 포함하는 모든 도큐먼트를 조회한다. 

여러개의 필드에서 검색어를 포함하는 도큐먼트 조회 결과

// Word 모델의 r_word 필드와 r_des 필드에서 쿼리를 포함하는 단어 검색후 최신순으로 정렬하고 6개만 가져오기
words = await Word.find({ $or: [      
    {r_word: {$regex: `${word}`}},
    {r_des: {$regex: `${word}`}} 
]})
.sort({"_id": -1})
.limit(6)

바로 위의 경우에서 나온 결과를 id 값을 이용하여 최신순으로 정렬하고 6개의 도큐먼트만 가져온다.

최신순으로 정렬후 6개의 도큐먼트만 추출한 결과

 

하나의 쿼리단어를 여러개의 필드에서 검색하는 방법

 

MongoDB에서 find() 검색시 여러 필드, 컬럼에서 찾는 방법

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

webisfree.com

 

 

728x90

'프로젝트' 카테고리의 다른 글

사전 검색 서비스 (리액트 버전)  (0) 2021.11.09