我一直致力于将一个小型Firebase项目转换到新的类似Firestore数据库,因为它具有更多可查询性,但我遇到了一个简单的查询问题。
我试图将所有文件都收集在一个集合中,如果每个文档都是一个俱乐部,那么该集合就是所有的俱乐部。
在Firebase中,我能够执行以下操作:
export function fetchClubs() {
const Club = firestore.ref('clubs');
return dispatch => {
Club.on('value', snapshot => {
dispatch({
type: FETCH_CLUBS,
payload: snapshot.val()
})
})
}
}
snapshot
将拥有我需要的所有信息。
我试图用Firestore复制它,但是只能遇到一个解决方案,它涉及创建一个新数组并循环结果然后将每个结果添加到该数据中。
这是我的Firestore尝试使用略有不同的Firestore语法
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot)
dispatch({
type: FETCH_CLUBS,
payload: querySnapshot.val()
})
})
}
}
如果您有任何想法,将非常感谢所有帮助!谢谢!
(这是我的第一篇stackoverflow帖子,轻松一点!:))
编辑:
Firestore文档中有关如何获取集合中所有文档的示例。
db.collection("cities").where("capital", "==", true)
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
编辑2:
我的新解决方案是使用.docs和.data()将文档放入可用的数组中。仍然看起来效率低下,因为我不得不循环遍历doucments并逐个提取可用信息。
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
var clubs = [];
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot.docs)
_.each(querySnapshot.docs, function(data){
clubs.push(data.data());
})
dispatch({
type: FETCH_CLUBS,
payload: clubs
})
})
}
}
答案 0 :(得分:1)
Firebase Realtime Database和Firestore之间的区别在于RTDB基本上只是一个云托管的JSON对象。因此,没有文档的概念,也没有数据的收集。
从RTDB检索的查询快照中的value对象只是一个JSON对象。因此,您可以通过其键访问一级节点(也可以通过其键访问任何一级节点)
如果您来自RTDB,您会注意到Cloud Firestore具有集合和文档的区别。因此,您的查询结果本质上将是数据集合,而不是JSON对象。从查询中检索的文档不能作为单个大JSON对象获取。
遍历查询结果是使用Cloud Firestore的正确方法。