我试图获取集合中的文档列表,但没有获取任何文档, 这是我正在尝试的代码- `
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, 模式捕捉:
答案 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/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 ...