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 шт):
В вашем коде нет ничего плохого, что-то не так с вашими ожиданиями.
Функция startAt()
работает как отправная точка вашего запроса, а не как фильтр. Таким образом, в вашем случае он найдет первое появление слова «Джон» и вернет все, начиная с этого момента (включая Джоэла, Кевина, Тима и т. д.).
К сожалению, нет прямого способа выполнить запрос, в котором findKey содержит строку «John». Но, к счастью, есть (частичное) решение проблемы с помощью endAt()
.
Ваш запрос будет выглядеть так:
orderBy="findKey"&startAt="john"&endAt="john\uf8ff"
Здесь \uf8ff
— последний символ Юникода (поправьте меня, если я ошибаюсь).
Благодаря этому вы можете запрашивать значения, начинающиеся с «Джон», например «Джонни», «Джон». Но не «1джон», «джом» или «Джоэл».
Ответ переведен с английского языка. На данный вопрос ответил - André Kool, тут