【问题标题】:Angularfire2 Firestore Update same field in multiple documentsAngularfire2 Firestore更新多个文档中的相同字段
【发布时间】:2018-08-11 14:17:46
【问题描述】:

我在 Firebase Firestore 上存储了一个配置文件表和一个作业表。我正在创建一个 Angular 5 网站。为了节省网络电话,我将用户个人资料名称添加到每个工作文档中。 (不确定firestore是否有表链接)。所以当用户更新他的名字时,我也必须更新他们的工作文件(不是很多)。我可以获得具有正确用户 ID 的作业集合。但我无法弄清楚如何在不使用 Observable(一次调用)的情况下遍历列表并更新一个字段。这是我尝试过的迫使我的浏览器进入连续循环的方法

jobsCollection : AngularFirestoreCollection<Job>;
jobDoc: AngularFirestoreDocument<Job>;

jobs: Observable<Job[]>;
job: Observable<Job>;

update(profile: Profile){
  this.jobsCollection = this.db.collection('jobs', ref => {
    return ref.where('user_id', '==',profile.user_id);
  });

  this.tracksCollection.valueChanges(item => {

    console.log('update this record:', item);

    item.forEach(job=> {
      console.log('This is the job');
      this.jobDoc = this.db.doc(`jobs/${job.id}`);
      job.name= profile.name;
      this.jobDoc.update(job);
    });


  });

}

任何帮助将不胜感激,谢谢 PK

【问题讨论】:

    标签: angular google-cloud-firestore angularfire2


    【解决方案1】:

    您需要一个.subscribe()this.jobsCollection 获取数据并遍历每个并更新文档,如

    this.jobsCollection.snapshotChanges().map(changes=>{
          return changes.map(a=>{
              const data = a.payload.doc.data();
              const id = a.payload.doc.id;
              return {id, ...data}
          })
        }).subscribe(items=>{
            items.forEach(job=>{
                this.db.doc(`jobs/${job.id}`).update({name:profile.name});
            })
         });
    

    我假设您在jobs 集合下的每个文档中都有一个名为id 的文件,否则您需要使用.snapshotChanges() 而不是.valueChanges()

    【讨论】:

    • 很遗憾,返回的作业不包括 ID。因此,当我使用 job.id 时出现错误“没有要更新的文档”@ /documents/jobs/undefined
    • 哦,谢谢,谢谢,谢谢。作为旁注,如果在客户端上进行此更新,您是否有意见,当他们更改名称时比在 Firebase 云功能中进行更新更好,这是由更新他们的个人资料触发的。我让它在云功能中运行良好(如果不是轻微延迟)。
    • 我认为在云功能中这样做是正确的方法。那么您确定这些字段已更新。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多