Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.03.2022, 21:27
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 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 пустая строка.

Если юзер ищей и через поиск, и выбрал категорию, то... то это тоже должно работать.

Как правило это сделать?

Просто сейчас если куда-то зателает пустая строка, то возвращаются сразу все посты.
Ответить с цитированием
  #2 (permalink)  
Старый 28.03.2022, 09:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от 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.
Ответить с цитированием
  #3 (permalink)  
Старый 28.03.2022, 09:18
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Можно и сложное условие сгоношить...
{
	$or:[
		{
			$not: {search: ''},
			$or:[
				{title: new RegExp(search, 'ig')},
				{text: new RegExp(search, 'ig')},
			]
		},
		{
			$not: {category: ''},
			{category: new RegExp(category, 'ig')}
		}
	]
}

Но какая в этом выгода?
Ответить с цитированием
  #4 (permalink)  
Старый 28.03.2022, 11:03
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от ksa Посмотреть сообщение
Можно и сложное условие сгоношить...
Но какая в этом выгода?
В смысле выгода?
Ответить с цитированием
  #5 (permalink)  
Старый 28.03.2022, 12:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от CryNet
В смысле выгода?
Короткое условие более понятно.
Наверняка и выполняться будет быстрее.

Чем не выгода?
Ответить с цитированием
  #6 (permalink)  
Старый 28.03.2022, 12:33
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 28.03.2022, 12:44
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от 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.
Ответить с цитированием
  #8 (permalink)  
Старый 28.03.2022, 12:56
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Так будет еще понятнее
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
}
Ответить с цитированием
  #9 (permalink)  
Старый 28.03.2022, 13:27
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от ksa Посмотреть сообщение
if ( search + category === '')
Чёт я тут сломался))
Ответить с цитированием
  #10 (permalink)  
Старый 28.03.2022, 13:48
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Если сложить (склеить) две пустые строки - получится пустая строка.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как правильно составить условие определяющее расширение файлов djadrenaline Общие вопросы Javascript 5 21.07.2012 23:34
Как написать регулярное выражение для поиска до конца строки isqad88 Общие вопросы Javascript 3 11.02.2012 15:34