firebase Firestore query .toUpperCase()不工作

92vpleto  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(115)

我试图创建一个网站,使用户能够搜索通过Firebase Firestore中的文档集合。这个过程包括将用户的输入保存为一个状态(useState),并利用useEffect钩子来查询Firebase数据库。
但是,我遇到了一个问题,在使用input.toUpperCase()方法时,查询无法按预期工作。它总是返回集合中的所有文档。奇怪的是,当将文本直接键入消息框而不将其转换为大写时,查询可以正常工作。
下面是相关的代码片段:

useEffect(() => {
  const fetch = async () => {
    const docRef = collection(db, "CenterBatchLvl");
    const m = message.toUpperCase(); // This doesn't work as expected.

    const q = query(docRef, where("batch", ">=", m)); // When I use 'message' instead of 'm', it works fine.

    const querySnapshot = await getDocs(q);
    const names = querySnapshot.docs.map(doc => doc.data().batch);
    console.log(querySnapshot.docs.map(doc => doc.data()));
    setPossible(names);
  }
  fetch();

字符串
请帮助我弄清楚为什么在这种情况下使用input.toUpperCase()不起作用,而在没有toUpperCase()方法的情况下直接将文本输入到消息框中会产生所需的结果。
消息状态设置如下

<Input maxW={400} onChange={(e) => { setMessage(e.target.value) }} type="text" />

blpfk2vs

blpfk2vs1#

我猜你是想找到以m的值**开始的结果。但你的问题是:

query(docRef, where("batch", ">=", m))

字符串
这个查询获取索引中的所有文档,按照batch的值对它们进行排序,查找第一个以m的值开始的文档,然后返回之后的所有结果。因此,它返回的结果以m的值开始,而不仅仅是以m的值开始的结果。
如果你只想要batchm的值开始的结果,你还需要提供一个结束条件:

query(docRef, where("batch", ">=", m), where("batch", "<=", m+"~")


这里的~不是魔术运算符,而只是ASCII范围内的高位字符,以便包括之前的所有结果。
如果您的batch字段包含超出ASCII范围的字符,则需要使用Unicode结束项:

query(docRef, where("batch", ">=", m), where("batch", "<=", m+"\uf8ff")

相关问题