首页 > 解决方案 > 从 firestore 查询 3 个集合

问题描述

我正在使用一个名为“Documento”的对象将数据存储在 Firestore 中,然后当我检索这些数据时,我将其存储在 JSON 结构中。现在,我的问题是现在我要完成三个查询。一个是时间表,另一个是医生,另一个是他的类型。这三个都存储在不同的查询中,现在我的日程安排需要从医生集合中获取医生姓名,并且他的类型在我的第三个集合中。

因此,我想知道一种将它们查询在一起并将它们合并为一个对象的方法,这样我就可以将我的患者信息与他的医生信息一起显示,从而生成我的日程安排,该日程安排将进入 HTML。

下面是我的 firebase/firestore 结构的屏幕截图:

我的日程安排需要某种外键 https://imgur.com/a/9lEtjNB

结构

患者结构

医疗结构

然后这是我如何从 Firestore 中检索我的数据作为 JSON 结构中的对象:

  carregarPerfil(){
    var query = firebase.firestore().collection("Usuario")
    var auxint = 0;
    this.dataAux
    let auxString = '[';
    query.where('Documento.nome', '==', 'Merlin').where('Documento.login', '==', 'merlin').get().then(res => {
      res.forEach(item => {

        auxint++;
        auxString += '{"id":"' + item.id + '","Usuario":' + JSON.stringify(item.data()) + '}';
        console.log(item);
        if (res.size != auxint)
          auxString += ', ';
      })
      auxString += ']';
      this.dataJSON = JSON.parse(auxString);
      this.Usuario = this.dataJSON;
      console.log(this.Usuario);
    }).catch(err => {
      console.log('algum erro ' + err);
    });
}

我曾尝试阅读 firestore 上的文档,但由于它没有将其视为 JSON,也没有显示如何使用 3 个查询逐步完成,这对我来说很难,因此我需要在这方面有一些帮助。

标签: angularfirebaseionic-frameworkgoogle-cloud-firestore

解决方案


以下将解决问题。由于您要并行获取三个文档,并且该get()方法是异步的并返回一个 Promise,因此您需要使用Promise.all(). 请注意,results数组的顺序与promises数组相同(因此第一个元素resultsespecialidade文档,然后是medico等)。

请注意,我已将集合名称改编为英文。只需修改以使用您自己的集合名称。文档 ID 也将适应您的。

    var db = firebase.firestore();
    var promises = []

    var especialidadeQuery = db.collection('specialties').doc('xTWQVLM8O9WRx89LS1Ba').get();
    promises.push(especialidadeQuery);

    var medicoQuery = db.collection('doctors').doc('CP5Gd2UwGyDYqs9eXuGl').get();
    promises.push(medicoQuery);

    var patienteQuery = db.collection('patients').doc('AMZpmX9BOyRlfPQpwfmz').get();
    promises.push(patienteQuery);

    Promise.all(promises).then(results => {
        results.map(docSnapshot => {
            console.log(docSnapshot.data());
        });
    });

但是请注意,如果您只需要患者、医生和专业的姓名,您可以将这些值直接存储在议程文档中。这种反规范化机制在 NoSQL 数据库中非常常见,并且允许优化查询(这里是 1 而不是 1+3)。


推荐阅读