Angularfire2 Firestore更新多个文档中的相同字段

时间:2018-03-03 13:48:29

标签: angular google-cloud-firestore angularfire2

我有一个配置文件表和一个存储在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

2 个答案:

答案 0 :(得分:3)

您需要.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});
        })
     });

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

答案 1 :(得分:2)

你可以那样做

for (int Radius = Rect_size; Radius < MaxRadius;)
         {
             x_Circle = MaxRadius - Radius;
             circumference_half = 2 * 3.1415 * Radius / 2;
             Rectangle_count = circumference_half / Rect_size;

             for (int i = 0; i < Rectangle_count - 1; i++)
             {
                  y_Circle = Center_Circle.y + sqrt(pow(Radius, 2) - pow(x_Circle - Center_Circle.x, 2));

                 if (y_Circle <= FRAME_Heigth && x_Circle <= FRAME_WIDTH && x_Circle >=0)
                 {
                     test = Rect(x_Circle, y_Circle, Rect_size, Rect_size);
                     rectangle(RectangePic, test, Scalar(0, 255, 255), 1, 8);
                     imshow("testee", RectangePic);
                     waitKey();
                 }
                 x_Circle += Rect_size;
             }

             Radius += Rect_size;
         }