【问题标题】:ReactNative Firestore multiple wheres and comparing resultReact Native Firestore 多个位置和比较结果
【发布时间】:2020-05-30 11:20:35
【问题描述】:

我正在尝试在我的应用程序中创建一个功能,允许用户选择两种药物,并在第三个屏幕中获取这两种药物是否有交互的结果。

为此,我有一个数据库,其中所选择的药物在交互数据库中传递一个“ATC”编号,称为 GRP1D 或 GRP2D。传递的两个 ATC 编号应与数据库中的 GRPD 编号进行比较,以便返回交互,如果没有,则应返回“无交互”。理想情况下,我会使用多个 where 子句和一个 OR 子句来使传递的 ATC 编号的顺序无关紧要。

我已经尝试了很多东西,但最后我什至不确定这是否可以通过 Firestore 实现。这里是数据库的相关部分

下面是我希望它工作的代码,显然它不是因为在 firestore 中似乎没有 OR 甚至多个 where 子句。任何想法如何解决?提前非常感谢!

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)

【问题讨论】:

    标签: javascript react-native google-cloud-firestore


    【解决方案1】:

    您已经发现,Cloud Firestore 不支持 OR 类型条件。这意味着您需要为每个 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)
        })
      });
    

    这会执行两个查询,当两个查询都完成后,它会获取有结果的那个并循环。


    如果您的 GRP1DGRP2D 的顺序无关紧要,您还可以考虑在文档中使用单个数组字段 GRPDs 并包含两个/所有 GRPD 值:

    GRPDs: ["atc2", "atc1"]
    

    有了这样一个字段,您可以使用单个 array-contains-any query 来获取最多 10 个值的文档:

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

    【讨论】:

    • 感谢您的回答。如何将文档字段 GRPD1 和 GRPD2 从数据库中获取到数组中?同样在您编写的查询中 GRPDs ,这不是 Firebase 中的文档字段
    • 如前所述:“您还可以考虑在您的文档中使用单个数组字段 GRPDs 与两个/所有 GRPD 值”。所以这将是一个允许此查询的新字段。
    • 这将是数据库中的一个字段,对吧?我不确定如何完成。此外,由于某种原因,第一个解决方案似乎没有返回任何东西。交互描述保持“未定义”,查询快照中的 console.log 根本不返回任何内容......我是新手,如果我问的是明显的事情,对不起。
    • 我用一个带有脚本的大 json 文件填充了数据库。
    • 在这种情况下,您仍然可以使用我回答的第一部分中的方法,使用两个查询。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多