728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
- MongoDB μ indexing μ μ΄μ©ν κ²μ κΈ°λ₯μ λ§λ€μ΄λ³΄μλ€.
- λλΆλΆμ DB λ€μ μ£Όλ‘ μμ΄μ μ΅μ νλ κ²μ κΈ°λ₯μ μ 곡νκ³ μμ΄, νκΈμ μ΅μ νλ κΈ°λ₯μ λ§λλ κ² μ½μ§ μμμ μκ² λμλ€.
- λΈλ‘κ·Έλ₯Ό μ°λ νμ¬μλ κ²μ κΈ°λ₯μ λ΄κ° μκ°ν μμ€μλ λλ¬νμ§ λͺ»νλ€. (μ΄λ μΆν μ‘°κΈ λ κ³ λ―Όν΄λ΄μΌ ν λΆλΆμ΄λ€.)
- νκΈμ μ΄μ μ λ§μΆμλλ μμ΄λ μΌλΆ λ΄μ©λ§ κ²μνλ κ²½μ° κ²μμ΄ λμ§ μλλ€.
- νκΈμ ν κΈμλ§ κ°μ§κ³ κ²μνλ κ²½μ° κ²μμ΄ λμ§ μλλ€.
π URL Query string
π€ κ²μμ°½ UI λ§λ€κΈ°
<div class="container input-group mb-1">
<input class="form-control" id="search-input">
<button class="input-group-append btn btn-danger" id="search">κ²μ</button>
</div>
- κΈ°μ‘΄μ ν μΌ λ¦¬μ€νΈ νμ΄μ§ HTML νμΌμ Bootstrap μ μ΄μ©νμ¬, κ²μμ°½ λ μ΄μμμ μΆκ°ν΄μ£Όμλ€.
- νμ κ²μνμ λ 보μ΄λ νλ©΄λ λμΌν λ μ΄μμμ΄ νμνλ―λ‘ λ΄μ©μ κ·Έλλ‘ λ³΅μ¬ν΄μ search λΌλ νμΌλͺ μ κ°μ§ EJS νμΌμ λ§λ€μ΄μ£Όμλ€.
- JavaScript μ½λ μμ±μ μ©μ΄νκ² νκΈ° μνμ¬ input νκ·Έμ button νκ·Έμ id λ₯Ό κ°κ° λΆμ¬ν΄μ£Όμλ€.
π€ GET μμ²μΌλ‘ μλ²μ λ°μ΄ν° 보λ΄κΈ°
- μλ²μ λ°μ΄ν°λ₯Ό λ³΄λΌ λλ POST μμ²μ μ¬μ©νλ©΄ λκ³ , μ΄ κ²½μ° req.body μ κ°μ ννλ‘ κΊΌλ΄μ΄ μ¬μ©μ΄ κ°λ₯νλ€.
- μ΄μΈμ GET μμ²μΌλ‘λ URL λ€μ λ°μ΄ν°λ₯Ό μ¬λ λ°©μμΌλ‘ κ°λ¨ν λ°μ΄ν° μ λ¬μ΄ κ°λ₯νλ€.
- URL λ€μ λ°μ΄ν°λ₯Ό μ¬λ λ°©μμ΄λ. URL μμ λ¬Όμν λ€μ μ 보λ₯Ό μ λ ₯νλ κ²μ λ§νλ©° μ΄λ νμμ΄ μ ν΄μ Έμλλ° μ΄λ₯Ό query string λλ query parameter λΌκ³ νλ€.
π€ Query string μμ±νμ¬ GET μμ²νκΈ°
$('#search').click(function(){
let searchVal = $('#search-input').val();
// κ²μ λ²νΌμ λλ₯΄λ©΄ /search?value=μ
λ ₯λ΄μ© κ²½λ‘λ‘ μ΄λ, GET μμ²
window.location.replace(`/search?value=${searchVal}`);
})
- input νκ·Έμ μ λ ₯λ κ°μ searchVal μ΄λΌλ λ³μμ ν λΉνμ¬, κ²μ λ²νΌμ ν΄λ¦νλ©΄ url μ /search?value= λ€μ λ€μ΄κ° μ μλλ‘ μ½λλ₯Ό μμ±ν΄μ£Όμλ€.
π€ μλ²μμ Query string νμΈνκΈ°
app.get('/search', function(req, res){
db.collection('post').find({ν μΌ: req.query.value}).toArray(function(err, result){
res.render('search.ejs', {post : result});
})
})
- console.log(req.query) λ₯Ό ν΄λ³΄λ©΄ query string μ object ννλ‘ κ°μ Έμμ λ³Ό μ μλ€.
- κ²μν λ΄μ©μ κ°μ§ λ°μ΄ν°λ₯Ό μ λΆ κ°μ Έμμ 보μ¬μ£Όμ΄μΌ νλ―λ‘ .findOne() ν¨μκ° μλ .find().toArray() ν¨μλ₯Ό μ¬μ©νλ€.
- db.collection μ€ post μμ κ²μν λ΄μ©μ μ°Ύμ λμλ req.query.value μ ννλ‘ μμ±ν΄μ£Όμ΄μΌ κ²μν λ¬Έμμ΄ κ·Έλλ‘μ ννλ‘ DB μμ κ²μμ΄ κ°λ₯νλ€.
π κ²μλ¬Όμ index λ§λ€κΈ°
π€ DataBase κ° κ²μλ¬Όμ μ°Ύλ λ°©λ² μμ보기
- κ·Έλ₯ κ²μλ¬Όμ νμΈνμ¬ μνλ λ°μ΄ν°λ₯Ό μ°Ύλ λ°©λ²μ μνλ λ°μ΄ν°λ₯Ό μ°Ύλ λ°μ μκ°μ΄ μ€λ 걸릴 κ°λ₯μ±μ΄ λλ€.
- λ°λΌμ, DB λ Binary Search λΌλ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ°Ύλλ° μ΄ λ°©λ²μ μ¬μ©νλ €λ©΄ 미리 μμλλ‘ μ λ ¬μ΄ λμ΄μμ΄μΌ νλ€.
- μ΄λ¬ν μμ μ λ ¬μ μ«μλΏλ§ μλλΌ λ¬Έμμ΄λ κ°λ₯νλ°, μ΄λ₯Ό indexing μ΄λΌκ³ νλ©°, ν΄λΉ collection μ μ λ ¬λ μ¬λ³Έμ νλ λ λ§λ€μ΄μ£Όλ κ²μ΄λ€.
π MongoDB μμ index λ§λ€κΈ°
- MongoDB μμ indexing μ νλ €λ©΄ μλμ λ°©λ²μΌλ‘ μ§ννλ©΄ λλ€.
- μνλ collection μ μ νν ν, indexes νμ λ€μ΄κ°λ©΄ CREATE INDEX λ²νΌ ν΄λ¦!
- λλ ν μΌ λ΄μ©μ λ°λΌ μ λ ¬μ ν μμ μ΄λ―λ‘ νλλͺ μ ν μΌ, νμ μ text λ‘ μ€μ ν΄μ£Όμλ€.
- κ·Έλ¬κ³ λλ©΄ μμ κ°μ index κ° λ§λ€μ΄μ§λ€.
π νκΈ κ²μμ μ ν©ν κ²μ κΈ°λ₯ λ§λ€κΈ°
π€ μΈλ±μ€λ₯Ό νμ©ν κ²μ κΈ°λ₯ λ§λ€κΈ°
app.get('/search', function(req, res){
db.collection('post').find({ $text : { $search: req.query.value }}).toArray(function(err, result){
res.render('search.ejs', {searchPost : result});
})
})
- .find() ν¨μ μμ $text : { $search : req. query.value } μ κ°μ΄ μμ±νλ©΄ λ§λ€μ΄λ text μΈλ±μ€μμ κ²μμμ§μ²λΌ κ²μμ΄ κ°λ₯νλ€.
- κ³΅λΆ κ°μ λΌκ³ κ²μνλ©΄ κ³΅λΆ λλ κ°μκ° ν¬ν¨λ λ°μ΄ν°λ€μ μ°Ύμμ€λ€.
- κ³΅λΆ -κ°μ λΌκ³ κ²μνλ©΄ 곡λΆκ° ν¬ν¨λ λ°μ΄ν°λ€ μ€ κ°μκ° ν¬ν¨λ λ°μ΄ν°λ€ μ μΈν λλ¨Έμ§ λ°μ΄ν°λ€μ μ°Ύμμ€λ€.
- "κ³΅λΆ κ°μ" λΌκ³ κ²μνλ©΄ μ ννκ² λ°μ΄ν μμ λ¬Έκ΅¬κ° ν¬ν¨λ λ°μ΄ν°λ€μ μ°Ύμμ€λ€.
- νμ§λ§ μ΄ λ°©λ²μ μμ΄μ μ΅μ νλ λ°©μμΌλ‘ μμ΄κ° μλ μΈμ΄(νΉν, μ‘°μ¬κ° λ§μ΄ μ°μ΄λ μΈμ΄)λ κ²μμ΄ μ λλ‘ λμ§ μλλ€λ λ¨μ μ΄ μλ€.
- 첫λ²μ§Έ ν΄κ²°μ± : κ²μν λ¬Έμμ μμ μ ννλ€.
- λλ²μ§Έ ν΄κ²°μ± : text search κΈ°λ₯μ μ¨μΌνλ€λ©΄ indexing λμ nGram κ³Ό κ°μ μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
- μΈλ²μ§Έ ν΄κ²°μ± : Search index λ₯Ό μ¬μ©νλ€.
π MongoDB Atlas μμλ§ μ 곡νλ κΈ°λ₯μΈ Search index μ¬μ©νκΈ°
- Cluster μ Search νμ λλ¬ μ μν ν, Create Search Index λ²νΌμ ν΄λ¦νλ€.
- Visual Editor λ₯Ό μ ν ν Next λ²νΌμ ν΄λ¦νλ€.
- Index Name μ λ§λ ν, μ΄λ€ collection μ μλ νλͺ©μ indexing ν κ²μΈμ§ μ ννλ€.
- Refine Your Index λ₯Ό ν΄λ¦νλ€.
- κΈ°μ‘΄μ lucene.standard λ₯Ό lucene language-lucene.korean μΌλ‘ λ°κΎΈμ΄μ€λ€. (νκΈ κ²μ μ΅μ νκ° λͺ©μ μ΄κΈ° λλ¬Έ!)
- Add Field λΆλΆμ μΆκ°ν΄λ λκ³ μν΄λ μκ΄μ μλ€.
- lucene.korean μΌλ‘ μ λ³κ²½λμλμ§ νμΈ ν Save Changes - Create Search Index λ₯Ό ν΄λ¦νλ€.
- μ μμ μΌλ‘ λͺ¨λ κ³Όμ μ΄ μλ£λμλ€λ©΄ μμ κ°μ νλ©΄μ νμΈν μ μλ€.
π€ Search index λ₯Ό μ΄μ©ν΄μ κ²μ μμ²νκΈ°
app.get('/search', function(req, res){
let condition = [
{
$search : {
index : 'todoSearch',
text : {
query : req.query.value,
path: 'ν μΌ' // ν μΌκ³Ό λ§κ°μΌ λ λ€ μ°Ύκ³ μΆμΌλ©΄ ['ν μΌ', 'λ§κ°μΌ']
}
}
},
{
$sort : { _id : 1 } // 1 μ μ€λ¦μ°¨μ, -1 μ λ΄λ¦Όμ°¨μ
},
{
$limit : 10 // κ°μ Έμ¬ λ°μ΄ν° κ°μ μ ν
}
];
db.collection('post').aggregate(condition).toArray(function(err, result){
res.render('search.ejs', {searchPost : result});
})
})
- .aggregate() ν¨μλ₯Ό μ¬μ©νλ©΄ κ²μ쑰건μ μ¬λ¬κ° λΆμΌ μ μλ€.
- λ¨, κ°μμ±μ μν΄ condition μ΄λΌλ λ³μλ₯Ό λ§λ€μ΄μ λ°°μ΄μ ννλ‘ μμ±ν΄μ£Όμλ€.
- $search λΌλ operator λ₯Ό λ£μΌλ©΄ search index μμ index λ₯Ό 골λΌμ κ²μν μ μλ€.
- $sort λΌλ operator λ₯Ό λ£μΌλ©΄ νΉμ μμ±μ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ, λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬ν μ μλ€.
- $limit μ΄λΌλ operator λ₯Ό λ£μΌλ©΄ κ²μλ μ 체 λ°μ΄ν°κ° μλλΌ ν΄λΉνλ κ°μλ§νΌ μμμ μ‘΄μ¬νλ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ€.
728x90
λ°μν
'[κ°λ°] Practice > Node.js MongoDB' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Node.js / MongoDB] μ΄λ―Έμ§ μ λ‘λ & μ΄λ―Έμ§ μλ² λ§λ€κΈ° (0) | 2022.03.16 |
---|---|
[Node.js / MongoDB] νμ κΈ°λ₯μ ν¬ν¨ν κ²μν κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.15 |
[Node.js / MongoDB] νμμΈμ¦κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.14 |
[Node.js / MongoDB] κΈ μμ κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.12 |
[Node.js / MongoDB] μμΈ νμ΄μ§ λ§λ€κΈ° (0) | 2022.03.12 |