Firebase получение данных по ключевым словам

Имеется проблема, как можно получить коллекцию пользователей с ПОХОЖИМ именем, а не точь-в-точь таким же, облазил все, не смог найти ответа. Например, пользователь вводит Да, нужно чтобы выводились пользователи с именами Данила, Даниил, Даня. И т.д. Суть, думаю понятна.

const [userName, setUserName] = useState('')
const [userNameDebounced] = useDebounce(userName, 150)

const [values, loading, error] = useCollectionData<IFirebase>(
    query(collection(database, 'users') as Query<IFirebase, DocumentData>),
    where('name', '==', userNameDebounced) as Options &
      IDOptions<IFirebase> &
      InitialValueOptions<IFirebase[]>
  )

console.log(values)

За перерендеры пока не важно, главное понять как получать данные не с таким же именно именем веденным в инпуте, а с похожим на него.


Ответы (1 шт):

Автор решения: surpri6e

В вашем коде нет ничего плохого, что-то не так с вашими ожиданиями.

Функция startAt() работает как отправная точка вашего запроса, а не как фильтр. Таким образом, в вашем случае он найдет первое появление слова «Джон» и вернет все, начиная с этого момента (включая Джоэла, Кевина, Тима и т. д.).

К сожалению, нет прямого способа выполнить запрос, в котором findKey содержит строку «John». Но, к счастью, есть (частичное) решение проблемы с помощью endAt().

Ваш запрос будет выглядеть так:

orderBy="findKey"&startAt="john"&endAt="john\uf8ff"

Здесь \uf8ff — последний символ Юникода (поправьте меня, если я ошибаюсь).

Благодаря этому вы можете запрашивать значения, начинающиеся с «Джон», например «Джонни», «Джон». Но не «1джон», «джом» или «Джоэл».

Ответ переведен с английского языка. На данный вопрос ответил - André Kool, тут

→ Ссылка