27.03.2022, 21:27
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
Как правило составить условие для поиска по базе используя 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 пустая строка.
Если юзер ищей и через поиск, и выбрал категорию, то... то это тоже должно работать.
Как правило это сделать?
Просто сейчас если куда-то зателает пустая строка, то возвращаются сразу все посты.
|
|
28.03.2022, 09:08
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от CryNet
|
Как правило это сделать?
|
Сначала нужно выяснить по каким ключам тебе нужно выполнить поиск, а потом его выполнять.
Т.е. нужно знать что использовать
Это
{
$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')},
]
}
Последний раз редактировалось ksa, 28.03.2022 в 12:43.
|
|
28.03.2022, 09:18
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Можно и сложное условие сгоношить...
{
$or:[
{
$not: {search: ''},
$or:[
{title: new RegExp(search, 'ig')},
{text: new RegExp(search, 'ig')},
]
},
{
$not: {category: ''},
{category: new RegExp(category, 'ig')}
}
]
}
Но какая в этом выгода?
|
|
28.03.2022, 11:03
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
|
|
28.03.2022, 12:21
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от CryNet
|
В смысле выгода?
|
Короткое условие более понятно.
Наверняка и выполняться будет быстрее.
Чем не выгода?
|
|
28.03.2022, 12:33
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
Сообщение от ksa
|
Короткое условие более понятно.
Наверняка и выполняться будет быстрее.
Чем не выгода?
|
Ну тогда у меня получается что-то такое
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
}
Выглядит страшненько
Последний раз редактировалось CryNet, 28.03.2022 в 12:35.
|
|
28.03.2022, 12:44
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от CryNet
|
Выглядит страшненько
|
Это если индусить.
Вот мой вариант...
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))
Последний раз редактировалось ksa, 28.03.2022 в 12:47.
|
|
28.03.2022, 12:56
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Так будет еще понятнее
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
}
|
|
28.03.2022, 13:27
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
Сообщение от ksa
|
if ( search + category === '')
|
Чёт я тут сломался))
|
|
28.03.2022, 13:48
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Если сложить (склеить) две пустые строки - получится пустая строка.
|
|
|
|