【问题标题】:Querying 3 collections from firestore从 firestore 查询 3 个集合
【发布时间】:2018-09-19 03:41:33
【问题描述】:

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

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

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

我的日程安排需要某种外键

下面是我如何从 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 个查询逐步完成,这对我来说很难,因此我需要一些帮助。

【问题讨论】:

  • 您可以将三个查询链接then(),一个接一个。事实上,由于get() 方法是异步的并返回一个promise,因此您必须等待promise 解析才能使用查询返回的值。您应该提供有关您的数据结构(即 3 个集合)的更多详细信息,以便社区能够为您提供帮助。另一种方法是对您的数据进行反规范化,例如,将医生的类型添加到医生文档中,将查询次数减少到 2。
  • 我已经用我当前结构的更详细的图片更新了主帖子,无论如何你能提供一个例子,说明在处理承诺后我将如何链接这些查询?
  • 我是否理解正确,在议程文档中,您具有其他三个文档(Especialidade、Medico 和 Patiente)的 ID,并且您希望在最后从这三个文档中获取信息(一口气)?
  • 是的,这正是我需要做的,但我不知道,我需要 Medico 的 nome 属性,我需要 Paciente 的 nome 属性,我需要 Especialidade 的 nome,并且用议程数据列出它们,基本上是某种外键,非规范化需要一段时间,因为我不确定处理的人是否能胜任这项工作
  • 看我的回答。请注意,在答案中,我们链接了多个 Promise,因为我们并行而不是按顺序执行它们。相反,我们使用的是Promise.all()

标签: angular firebase ionic-framework google-cloud-firestore


【解决方案1】:

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

请注意,我已将集合名称改编为英文。只需修改以使用您自己的集合名称。 Doc 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)。

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2019-12-03
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2018-12-09
    相关资源
    最近更新 更多