Как правило составить условие для поиска по базе используя 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, время: 02:54. |