Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как правило составить условие для поиска по базе используя mongoose? (https://javascript.ru/forum/node-js-io-js/83830-kak-pravilo-sostavit-uslovie-dlya-poiska-po-baze-ispolzuya-mongoose.html)

CryNet 27.03.2022 21:27

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

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

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

Просто сейчас если куда-то зателает пустая строка, то возвращаются сразу все посты.

ksa 28.03.2022 09:08

Цитата:

Сообщение от 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 09:18

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

Но какая в этом выгода? :-?

CryNet 28.03.2022 11:03

Цитата:

Сообщение от ksa (Сообщение 544391)
Можно и сложное условие сгоношить...
Но какая в этом выгода? :-?

В смысле выгода? :)

ksa 28.03.2022 12:21

Цитата:

Сообщение от CryNet
В смысле выгода?

Короткое условие более понятно.
Наверняка и выполняться будет быстрее.

Чем не выгода? ;)

CryNet 28.03.2022 12:33

Цитата:

Сообщение от ksa (Сообщение 544391)
Короткое условие более понятно.
Наверняка и выполняться будет быстрее.

Чем не выгода? ;)

Ну тогда у меня получается что-то такое

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
  }


Выглядит страшненько

ksa 28.03.2022 12:44

Цитата:

Сообщение от CryNet
Выглядит страшненько

Это если индусить. :D

Вот мой вариант...
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:56

Так будет еще понятнее
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
}

CryNet 28.03.2022 13:27

Цитата:

Сообщение от ksa (Сообщение 544396)
if ( search + category === '')

Чёт я тут сломался))

ksa 28.03.2022 13:48

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


Часовой пояс GMT +3, время: 02:54.