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

Gea*_*han 5 javascript firebase google-cloud-platform google-cloud-firestore

我正在尝试使用以下代码从 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');
}
});
Run Code Online (Sandbox Code Playgroud)

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

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

然而,这会导致当任一条件为真时不会显示任何数据。这段代码有什么不正确的地方?

Ren*_*nec 7

借助 Cloud Firestore,我们可以组合多种where()方法来创建逻辑AND查询。这些查询在文档中称为复合查询。

\n\n

但是,如文档中所示(\xe2\x80\x9c查询限制\xe2\x80\x9d 节):

\n\n
\n

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

\n\n
    \n
  • \xe2\x80\xa6
  • \n
  • 逻辑或查询。在这种情况下,您应该为每个 OR 条件创建一个单独的查询,并将查询结果合并到您的应用程序中。
  • \n
  • \xe2\x80\xa6
  • \n
\n
\n\n
\n\n

为了实现文档中提出的解决方案,您可以执行以下操作:

\n\n
  const usersRef = db.collection(\'MediCorePatientUsers\');\n\n  async function getMediCorePatientUsers(email) {\n    const q1 = usersRef.where("GPID", "==", email).get();\n    const q2 = usersRef.where("InsuranceCompany", "==", email).get();\n\n    const [querySnapshot1, querySnapshot2] = await Promise.all([q1, q2]);\n\n    const usersArray1 = querySnapshot1.docs;\n    const usersArray2 = querySnapshot2.docs;\n\n    return usersArray1.concat(usersArray2);\n  }\n\n\n  //You can then call the asynchronous getMediCorePatientUsers() function as follows\n  auth.onAuthStateChanged(user => {\n    if(user) {\n       getMediCorePatientUsers(user.email).then(result => {\n            result.forEach(docSnapshot => {\n                renderPatientList(docSnapshot);\n            });\n       });\n    } else {..}\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

下一篇文章将更详细地解释这种方法,特别是如果您需要对两个数组(usersArray1 和 usersArray2)进行重复数据删除,该怎么做。(免责声明,我是本文的作者)

\n

  • 非常清晰简洁的答案,这正是我正在寻找的解决方案。谢谢你! (2认同)