SnapshotChanges订阅未检测到子集合项的最终删除

问题描述 投票:0回答:1

我有以下代码从Cloud Firestore检索一些用户信息-它从用户文档的子集合中获取用户所属挑战的列表,然后使用这些ID从顶级挑战中收集完整的挑战信息文档。

[删除挑战时,我将其从主要挑战文档中删除,然后在每个用户挑战子集合中删除ID参考。 UI可以很好地更新每次删除,因为快照更改是一个活动订阅,直到我删除最后一个订阅为止。最后一个将从数据库中删除,但会保留在UI中,直到我刷新或提出新挑战为止。

我的理论是,由于删除了挑战子集合中的最后一个文档,也会删除该子集合,这意味着快照更改将不会运行,因为数据库中不再有任何集合可以监视其更改。

关于如何解决此问题的任何想法都很棒。

  getChallenges() {
    return this.getCurrentUserId().pipe(switchMap(userId => {
      return this.db.collection(`users/${userId}/challenges`).snapshotChanges().pipe(
        map(actions => actions.map(a => {
          const data = a.payload.doc.data();
          console.log('in get challenges: ', data);
          const user_challenge_key = a.payload.doc.id;
          return this.getOneChallenge(data['id'], user_challenge_key);
        }))
      );
    }));
  }

  getOneChallenge(id, user_challenge_key = null): Observable<Challenge> {
    return this.db.doc(`challenges/${id}`).snapshotChanges().pipe(
      take(1),
      map(changes => {
        const data = new Challenge(changes.payload.data());
        const challengeId = changes.payload.id;
        data.user_challenge_key = user_challenge_key;
        data.id = id;
        console.log('in get One challenge: ', data);
        return data;
      })
    );
  }
javascript firebase google-cloud-firestore rxjs angularfire
1个回答
0
投票

也许为了保留子集合而保留一个虚拟文档

例如,验证是否要删除该子集合的最后一个元素,添加虚拟对象,然后再删除最后一个元素

对于第一次插入检查,如果虚拟对象是唯一的文档,在那之后添加您的第一个条目并删除虚拟对象

我在Firestore的Google网上论坛中找到了具有相似方法的相似question

© www.soinside.com 2019 - 2024. All rights reserved.