如何使用角度Firestore获取集合中的文档列表

时间:2019-04-11 16:54:56

标签: angular firebase google-cloud-firestore angularfire2

我试图获取集合中的文档列表,但没有获取任何文档, 这是我正在尝试的代码- `

schoolProductCollectionFetch(schoolName){

   const school = this.db.collection(schoolName)
   this.school$ = school.snapshotChanges().pipe(map(schoollist=>schoollist.map(s=>{
     const data = s.payload.doc.id;
     console.log(data);
     return data;
   })));
   return this.school$

  }

数据库格式: SchoolCollection->文档-> ProductCollection

SchoolCollection:{
   1st:{products:{}},
   2nd:{products:{}},
}

曾尝试将数据格式表示为firestore中的格式,我想获取1st,2nd,这是SchoolCollection的文档ID, 模式捕捉:

Schema Screenshot 注意:如果需要更多详细信息以了解查询,请告诉我

3 个答案:

答案 0 :(得分:2)

您可以尝试类似的操作:

schoolProductCollectionFetch(): Observable<School[]> {
  return this.db
    .collection('schoolName')
    .snapshotChanges()
    .pipe(
      map((snaps) =>
        snaps.map((snap) => {
          return new School({
            id: snap.payload.doc.id,
            ...(snap.payload.doc.data() as {}),
          });
        }),
      ),
      first(),
    );
}

获取数据并创建它的实例之后,可以重构此代码,使其更具可读性。希望这会有所帮助!

答案 1 :(得分:0)

我遇到的第一个问题:您正在将参数'schoolName'传递给函数,然后执行this.db.collection(schoolName)。现在,学校名称实际上是集合的名称,还是集合中文档的ID?

尝试此操作时,您在控制台输出中遇到什么错误?您是否已设置Firestore权限以允许请求?

您发布的数据库架构令人困惑,也许从Firebase控制台进行设置的实际屏幕截图可能会更有用。

EDIT

要使用Firestore获取集合的数据,您必须构建所需集合的正确路径。在您的示例中,执行类似this.db.collection(schoolName).get()的操作将获取该集合中的所有文档。注意:这将不会获得任何子集合! Firebase在编写此查询时不支持这种查询。

假设您要获取子集合“ kitProducts”的所有文档。这可以通过执行this.db.collection(schoolName + "/1st/kitProducts").get()来实现。这将返回子集“ kitProducts”中的所有文档,这些子文档位于schoolName集合中ID为“ 1st”的文档下。您必须建立这些路径才能查询它们。

您似乎正在研究馆藏中的实时侦听器。如果您打算这样做,则应使用onSnapshot()函数。以前面的示例为例,编写类似this.db.collection(schoolName + "/1st/kitProducts").onSnapshot()的内容。在这种情况下,只要在kitProducts子集合中的文档被编辑,删除或添加,就会发出一个事件。

更多阅读内容:

https://firebase.google.com/docs/firestore/query-data/listen#listen_to_multiple_documents_in_a_collection

https://firebase.google.com/docs/firestore/query-data/get-data#get_all_documents_in_a_collection

答案 2 :(得分:0)

不确定是否仍需要此功能,但您可能想尝试collectionGroup('Name of collection')

代码应类似于以下内容:

    this.afs.collectionGroup('Users')
      .valueChanges().subscribe(users => {
      
      //this.userNames is an "Any" before my constructor.
      this.userNames = users

      //for loop allows me to get all the document's data
      for (let i = 0; i < users.length; i++) {
        
        //these const allow me to play with If conditionals
        const userEmail = this.userNames[i].email;
        const userRole = this.userNames[i].role;

        if (userRole == "User") {
          continue;
        } else {
          console.log(userEmail);
        }
      }
    });

任何东西都有HTH ...