Как правило составить условие для поиска по базе используя mongoose?
Есть следущий код для поиска постов по базе:
async search(search, category) {
const posts = await Post.find({
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
{category: new RegExp(category, 'ig')}
]
})
return posts
}
Если юзер ищет посты через поиск, то слово для поиска прилетает в search, а в category залетает пустая строка. Если юзер ищет посты по категориям, то в category залетает категория (текст), а в search пустая строка. Если юзер ищей и через поиск, и выбрал категорию, то... то это тоже должно работать. Как правило это сделать? Просто сейчас если куда-то зателает пустая строка, то возвращаются сразу все посты. |
Цитата:
Т.е. нужно знать что использовать Это
{
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
{category: new RegExp(category, 'ig')}
]
}
Это
{category: new RegExp(category, 'ig')}
Или это
{
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
]
}
|
Можно и сложное условие сгоношить...
{
$or:[
{
$not: {search: ''},
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
]
},
{
$not: {category: ''},
{category: new RegExp(category, 'ig')}
}
]
}
Но какая в этом выгода? :-? |
Цитата:
|
Цитата:
Наверняка и выполняться будет быстрее. Чем не выгода? ;) |
Цитата:
async search(search, category) {
let posts
if (search && category) {
posts = await Post.find({
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
{category: new RegExp(category, 'ig')}
]
})
} else if (search) {
posts = await Post.find({
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')}
]
})
} else if (category) {
posts = await Post.find({
$or:[
{category: new RegExp(category, 'ig')}
]
})
} else {
posts = {}
}
return posts
}
Выглядит страшненько |
Цитата:
Вот мой вариант...
const search = ''
const category = ''
let q
const q1 = {
'$or': [
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
]
}
const q2 = {category: new RegExp(category, 'ig')}
if ( search + category === '') {
q = {}
} else if (search) {
q = q1
if (category) q['$or'].push(q2)
} else {
q = q2
}
// Тут выполняется запрос
alert(JSON.stringify(q))
|
Так будет еще понятнее
const search = ''
const category = ''
const q = query(search, category)
// тут запрос
alert(JSON.stringify(q))
// Формирование условия
function query(search, category) {
const q1 = {
'$or': [
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
]
}
const q2 = {category: new RegExp(category, 'ig')}
if ( search + category === '') {
return {}
} else if (search) {
if (category) q1['$or'].push(q2)
return q1
}
return q2
}
|
Цитата:
|
Если сложить (склеить) две пустые строки - получится пустая строка. ;)
|
Цитата:
|
| Часовой пояс GMT +3, время: 22:02. |