【问题标题】:How to use "get" method to retrieve all collection in angularfire2如何使用“get”方法检索 angularfire2 中的所有集合
【发布时间】:2017-11-29 09:15:05
【问题描述】:

Firebase 云存储提供“get”方法来检索整个集合,如下所示 -

    db.collection("users").get().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
            console.log(doc);
        });
    });

我在我的 ionic 3 项目中使用 Angularfire2 版本 5.0.0rc3 来连接 firebase 云存储。

我正在尝试按以下方式访问此 get 方法 -

    constructor(
        private afs: AngularFirestore
    ) {
    
        this.afs.collection("users").get().then((querySnapshot) => {
            querySnapshot.forEach((doc) => {
                console.log(doc);
            });
        });
            
    }

但在这里,“get”方法不起作用。谁能告诉我谁使用这个“get”方法和 firebase 云存储和 angularfire2。

【问题讨论】:

  • 试试.ref.get()
  • 太棒了!我一直在寻找它。 :) 非常感谢。

标签: angular firebase ionic3 angularfire2 google-cloud-firestore


【解决方案1】:

其实可以,只要调用firestore this.afs.firestore.collection

let userDoc = this.afs.firestore.collection(`users`);
userDoc.get().then((querySnapshot) => { 
   querySnapshot.forEach((doc) => {
        console.log(doc.id, "=>", doc.data());  
   })
})

【讨论】:

  • 希望他们能更明确地说明这一点。从一开始就不明显。
【解决方案2】:

AngularFirestore collection 中不存在get() 方法,请改用subscribe

这是一个例子:

this.afs.collection("users").snapshotChanges().map(actions => {
  return actions.map(a => {
    const data = a.payload.doc.data();
    const id = a.payload.doc.id;
    return { id, ...data };
  });
}).subscribe((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(doc);
    });
});

我建议你先阅读angularfire2 guide

【讨论】:

  • 谢谢,它有效。有没有办法不跟踪快照更改事件?我已经在 angularfire 文档中看到它,但在我看来 get() 只提供特定时间的数据,并且不听任何变化。这就是为什么要寻找 get()。 'snapshotChanges' 是否总是触发每次更改。我其实不想继续听任何事件,只需要当时的数据。
  • 最好的选择是使用first()take(1)
【解决方案3】:

我也面临同样的问题。对我来说,当检索大数据时浏览器会挂起。此外 valueChanges() 会监听新的变化,这段代码再次开始执行。

为了检索大数据,最好写一个云函数。从云端函数中获取数据,然后在 Angular 应用程序下显示。

Firebase Cloud Functions

【讨论】:

    【解决方案4】:

    带有新 @angularfire 包的 Angular 8

    let query = this.fs.collection('users')
    
        return query.get()
        .pipe(
            map(snapshot => {
                let items = [];
                snapshot.docs.map(a => {
                    const data = a.data();
                    const id = a.id;
                    items.push({ id, ...data })
                })
                return items
            }),
        )
    

    【讨论】:

      【解决方案5】:

      当我想从 Firestore 检索单个文档而不需要 valueChanges 或 SnapshotChanges 时,我做了什么——Angular Firestore

       this.db.collection<any>('members').doc(id)
      .get()
      .pipe(first())
      .subscribe(res => {
         this.member = res.data()
       })
      

      【讨论】:

        【解决方案6】:

        我的 2 美分如下,你可以这样做。在我的用例中,我不需要定期观察值的变化,而当数据不经常更改时,我不想一直调用数据库是一个不错的功能。所以我创建了一个数据服务,在应用程序“start”/“init”上我预先加载了所需的数据(一定要添加一些限制——在这种情况下,服务已经有限制),如下所示:

        private getServices() {
          let data = [];
          const collection = this.afs.collection<Service>('services', ref => ref.where('isAddOn', '==', false).orderBy('name', 'asc'));
          collection.get().subscribe(snapshot => {
            snapshot.forEach((res) => {
              data.push(res.data());
            });
          });
          return this._services = data;
        }
        

        然后我可以将它分配给一个 getter 并在必要时使用它。

        请记住,这非常适合我的特定用例。由于数据不会经常更改,并且我有一个单独的“刷新”调用来管理 UI 上必要的数据更新。

        希望这会有所帮助,也欢迎任何反馈和想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多