首页 > 解决方案 > 如何使用 AngularFireDatabase 以更好的方式查询列表?

问题描述

在此处输入图像描述

"@angular/fire": "^5.2.3",

我正在使用 AngularFireDatabase 来操作 firebase 中的数据。我需要在 Firebase 中检索和更新下表。我目前正在使用以下方法进行操作。有什么方法可以用来更好地查询吗?因为,我正在下载整个表格,然后再次上传。我不想下载整个提交列表,而只想将一个对象直接推送到提交数组。提前致谢。

// Get form submissions for a specific form
getFormSubmissions(key: string) {
    this.userSubmissionsList = this.db.list('/form-submissions', ref => ref.orderByChild('formId').equalTo(key));
    return this.userSubmissionsList;
}

getSingleFormForSubmission(key: string) {
    this.submission = this.db.object('/form-submissions/' + key);
    return this.submission;
}

             
             
this.formService.getFormSubmissions(this.formId).snapshotChanges().subscribe(response => {
     let key = null;
     response.forEach(item => {
       const a: any = item.payload.toJSON();
       key = item.key;
     });
                    
     this.formService.getSingleFormForSubmission(key).valueChanges().subscribe(resp => {
        if (resp.submission === undefined) { resp.submission = []; }
          this.formSubs = resp;
     });
  });

推送数据如下:

this.formSubs.submission.push(data);
this.formService.submitUserValues(this.formSubs);

标签: javascriptangularfirebase-realtime-databasefirebase-authenticationangularfire2

解决方案


您在 Firebase 中存储了一个 JavaScript 数组,不幸的是,这意味着它变得难以操作。要将项添加到数组中,您必须知道该数组中已经存在多少项,这需要您首先阅读它。

这是 Firebase 文档建议不要使用数组,而是使用所谓的推送 ID 将项目添加到列表的众多原因之一。从该文档中:

使用该push()方法将数据附加到多用户应用程序中的列表。push()每次将新子项添加到指定的 Firebase 引用时,该方法都会生成一个唯一键。通过为列表中的每个新元素使用这些自动生成的键,多个客户端可以同时将子元素添加到同一位置,而不会发生写入冲突。生成的唯一键push()是基于时间戳的,因此列表项会自动按时间顺序排序。

我还建议您查看这篇古老但仍然非常真实的博文 Best Practices: Arrays in Firebase


推荐阅读