使用条件从Firestore实时获取数据

时间:2020-04-01 08:16:43

标签: angular typescript firebase google-cloud-firestore

我有一个函数,可以使用whereget从Firestore提取数据。问题是,如果添加了新记录,则不会将其实时推送到客户端。我知道我必须使用.valueChanges(),但是我还需要在.where()条件下获取数据,因为我无法获取全部数据

我只需要获取logged in user的数据。这就是为什么需要where条件的原因。

如何将两者同时使用?

这是我当前的代码:

assign_by(){
  this.goalList =[];
  this.storage.get('loggedInUser').then((val) => {
    console.log('Your user ID is', val);
    this.loggedInusr = val;

    firebase.firestore().collection(`todos`)
    //.where("assignTo", "==", this.loggedInusr)
   .where("assignBy", "==", this.loggedInusr)
   //.where("followers", "array-contains", this.loggedInusr)
    .get()
   //.valueChanges()
    .then(querySnapshot => {
        querySnapshot.forEach(doc=> {
            // doc.data() is never undefined for query doc snapshots
            console.log("assignby");
            console.log(doc.id, " ===> ", doc.data());
            this.goalList.push(doc.data());
        });
      });

  });
}

编辑1

按照指导,我已将当前代码更改如下:

assign_to(){

      this.goalList =[];
      this.storage.get('loggedInUser').then((val) => {
        console.log('Your user ID is', val);
        this.loggedInusr = val;
        firebase.firestore().collection(`todos`)
        .where("assignTo", "==", this.loggedInusr)
       .onSnapshot(function(querySnapshot) {           
        querySnapshot.forEach(function(doc) {
            console.log(doc.data());
            console.log("assignby");
            console.log(doc.id, " ===> ", doc.data());
            this.goalList.push(doc.data());
        });
    });
      });
    }

已登录用户添加了新记录,因此应该在该屏幕上看到新记录,该屏幕显示了该用户分配的所有记录。

我添加了此记录:

enter image description here

但此处未更新:

enter image description here

编辑2

如上图所示,显示assign_by()功能来自此功能。请注意,如果我再次打开此页面,则可以看到新记录。

assign_by(){
  this.goalList =[];
  this.storage.get('loggedInUser').then((val) => {
    console.log('Your user ID is', val);
    this.loggedInusr = val;

    firebase.firestore().collection(`todos`)
    //.where("assignTo", "==", this.loggedInusr)
   .where("assignBy", "==", this.loggedInusr)

    // .get()
    // .then(querySnapshot => {
      .onSnapshot(function(querySnapshot) {           
        querySnapshot.forEach(function(doc) {
            console.log(doc.data());
            console.log("assignby");
            console.log(doc.id, " ===> ", doc.data());
            this.goalList.push(doc.data());
        });
    });

        // querySnapshot.forEach(doc=> {
        //     // doc.data() is never undefined for query doc snapshots
        //     console.log("assignby");
        //     console.log(doc.id, " ===> ", doc.data());
        //     this.goalList.push(doc.data());
        // });
      // });

  });
}

1 个答案:

答案 0 :(得分:2)

您可以很好地在onSnapshot()上调用Query方法,如下所示:

    firebase.firestore().collection('todos')
   .where("assignBy", "==", this.loggedInusr)
    .onSnapshot(function(querySnapshot) {           
        querySnapshot.forEach(function(doc) {
            console.log(doc.data());
        });
    });

通过执行firebase.firestore().collection('todos').where("assignBy", "==", this.loggedInusr).get(),您实际上仅查询数据库一次,因此,您无法检测到集合中是否有任何更改(例如,添加的记录)(与您的查询相对应)在此初始且唯一提取之后。请参见get()方法文档here