如何在JavaScript中使用OR运算符从Firestore检索数据?

5

我正在尝试使用以下代码从Firestore集合中读取数据:

auth.onAuthStateChanged(user => {
if(user) {
  console.log('User logged in:', user)

db.collection('MediCorePatientUsers').where("GPID", "==", user.email)
.get().then((snapshot) => {
    snapshot.docs.forEach(doc => {
        renderPatientList(doc);
        })
    })

document.getElementById("nameOfUser").innerHTML = user.email;

} else {
  console.log('User logged out');
}
});

这段代码按预期工作,并在我的网页上显示正确的数据。然而,我想添加另一个条件到代码中,使用“或”运算符来显示"InsuranceCompany"字段也等于当前用户的电子邮件的数据。

db.collection('MediCorePatientUsers').where("GPID", "==", user.email || "InsuranceCompany", "==", user.email)
.get().then((snapshot) => {
snapshot.docs.forEach(doc => {
    renderPatientList(doc);
    })
})

然而,当任一条件为真时,这将导致数据均未显示。这段代码有什么问题吗?

2个回答

7
使用 Cloud Firestore,我们可以结合多个 where() 方法创建逻辑 AND 查询。这些查询在文档中被称作复合查询
然而,如文档所示(“查询限制”部分):

Cloud Firestore 不支持以下类型的查询:

  • 逻辑 OR 查询。在这种情况下,您应该为每个 OR 条件创建单独的查询,并在应用程序中合并查询结果。

为了实现文档中提出的解决方案,您可以按照以下方式进行:
  const usersRef = db.collection('MediCorePatientUsers');

  async function getMediCorePatientUsers(email) {
    const q1 = usersRef.where("GPID", "==", email).get();
    const q2 = usersRef.where("InsuranceCompany", "==", email).get();

    const [querySnapshot1, querySnapshot2] = await Promise.all([q1, q2]);

    const usersArray1 = querySnapshot1.docs;
    const usersArray2 = querySnapshot2.docs;

    return usersArray1.concat(usersArray2);
  }


  //You can then call the asynchronous getMediCorePatientUsers() function as follows
  auth.onAuthStateChanged(user => {
    if(user) {
       getMediCorePatientUsers(user.email).then(result => {
            result.forEach(docSnapshot => {
                renderPatientList(docSnapshot);
            });
       });
    } else {..}
  }

这种方法在以下 文章 中有更详细的解释,特别是如何去重两个数组(usersArray1和usersArray2)。(声明,我是该文章的作者)


2
非常清晰简洁的答案,这正是我在寻找的确切解决方案。谢谢! - Gearoid Sheehan

-3

您可以按照以下方式使用

db.collection('MediCorePatientUsers').where("GPID == " + user.email + " || InsuranceCompany == " + user.email + "")


2
这样做是行不通的,因为 where 方法的第一个参数必须是字符串或 FieldPath。 - Renaud Tarnec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接