查询Firestore集合中的所有文档而不进行循环

时间:2017-10-10 22:06:07

标签: javascript reactjs firebase google-cloud-firestore

我一直致力于将一个小型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
        })
    })
}

}

1 个答案:

答案 0 :(得分:1)

Firebase Realtime Database和Firestore之间的区别在于RTDB基本上只是一个云托管的JSON对象。因此,没有文档的概念,也没有数据的收集。

从RTDB检索的查询快照中的value对象只是一个JSON对象。因此,您可以通过其键访问一级节点(也可以通过其键访问任何一级节点)

如果您来自RTDB,您会注意到Cloud Firestore具有集合和文档的区别。因此,您的查询结果本质上将是数据集合,而不是JSON对象。从查询中检索的文档不能作为单个大JSON对象获取。

遍历查询结果是使用Cloud Firestore的正确方法。