ReactNative Firestore несколько адресов и сравнение результатов - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь создать в своем приложении функцию, которая позволяет пользователю выбрать два лекарства, а на третьем экране получить результат, взаимодействуют ли эти два препарата.

Для этого у меня есть база данных с взаимодействиями выбранные лекарственные препараты передают номер «AT C», называемый GRP1D или GRP2D в базе данных взаимодействий. Два переданных числа AT C следует сравнить с числами GRPD в базе данных, чтобы вернуть взаимодействие, или, если его нет, следует вернуть «Нет взаимодействия». В идеале я бы использовал несколько предложений where в сочетании с предложением OR, чтобы сделать последовательность переданных чисел AT C несущественной.

Я пробовал много вещей, но в конце концов я даже не уверен, что это возможно с пожарным магазином. Вот соответствующая часть базы данных enter image description here

Ниже приведен код, который я хотел бы, чтобы он работал, очевидно, что это не так, потому что, похоже, нет ИЛИ или даже несколько предложений where в firestore. Любая идея, как это можно решить? Заранее большое спасибо!

render() {
   console.log(this.state.atc1);
    console.log(this.state.atc2);
    var atc1 = this.state.atc1
    var atc2 = this.state.atc2
    var interactiondescription
    dbh.collection('IX')
      .where('GRP1D', '==', atc1)
      .where('GRP2D', '==', atc2)
      or
      .where('GRP1D', '==', atc2)
      .where('GRP2D', '==', atc1)
      .get()
      .then(querySnapshot => {
        querySnapshot.forEach(doc => {

         interactiondescription = doc.data().MEASD
        console.log('this', interactiondesctription)
        })
      });

    //console.log('Desc:', this.interactiondescription)

1 Ответ

0 голосов
/ 30 мая 2020

Как вы уже выяснили, Cloud Firestore не поддерживает условия типа ИЛИ. Это означает, что вам нужно будет запустить отдельный запрос для каждого из этих OR, что, к счастью, не так уж плохо в вашем случае:

let query1 = dbh.collection('IX')
  .where('GRP1D', '==', atc1)
  .where('GRP2D', '==', atc2);
let query2 = dbh.collection('IX')
  .where('GRP1D', '==', atc2)
  .where('GRP2D', '==', atc1);
Promise.all([query1.get(), query2.get()])
  .then((querySnapshots) => {
    console.log('Queries executed: ', querySnapshots);
    let querySnapshot = !querySnapshots[0].empty() ? querySnapshots[0] : querySnapshots[1];
    querySnapshot.forEach(doc => {
      interactiondescription = doc.data().MEASD
      console.log(interactiondesctription)
    })
  });

Это выполняет два запроса, и когда оба будут выполнены, потребуется тот, который имеет результаты и зацикливается на этом.


Если порядок ваших GRP1D и GRP2D не имеет значения, вы также можете рассмотреть возможность наличия единого поля массива GRPDs в вашем документы с обоими / всеми GRPD значениями:

GRPDs: ["atc2", "atc1"]

С таким полем вы можете использовать один array-contains-any запрос для получения документов до 10 значений:

dbh.collection('IX').where('GRPDs', 'array-contains-any', [atc1, atc2]);
...