| 
	| 
	
	| 
		
	| 
			
			 
			
				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,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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,298
					 
		
 |  |  
	| Можно и сложное условие сгоношить... 
{
	$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,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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,298
					 
		
 |  |  
	| Так будет еще понятнее 
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,298
					 
		
 |  |  
	| Если сложить (склеить) две пустые строки - получится пустая строка.   |  |  |  |