Как получить данные из Firestore, используя оператор OR в JavaScript? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь прочитать данные из коллекции 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 ]

2 голосов
/ 06 января 2020

С помощью Cloud Firestore мы можем комбинировать несколько where() методов для создания логических И запросов. Эти запросы называются составными запросами в документации.

Однако, как указано в документации (раздел « Ограничения запросов »):

Cloud Firestore не поддерживает следующие типы запросов:

  • Логические ИЛИ запросы . В этом случае вы должны создать отдельный запрос для каждого условия ИЛИ и объединить результаты запроса в вашем приложении.

Для реализации Решение, предложенное в документации, можно сделать следующим образом:

  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). (отказ от ответственности, я автор статьи)

0 голосов
/ 06 января 2020

Вы можете использовать следующим образом

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...