Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查询Firestore集合中的所有文档而不进行循环_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

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

Javascript 查询Firestore集合中的所有文档而不进行循环,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我一直在致力于将一个小型Firebase项目转换为新的、类似的Firestore db,因为它更容易查询,但我遇到了一个简单的查询问题 我试图获取一个集合中的所有文档,如果每个文档都是一个俱乐部,那么集合就是所有俱乐部 在Firebase,我可以做一些类似的事情: export function fetchClubs() { const Club = firestore.ref('clubs'); return dispatch => { Club.on('

我一直在致力于将一个小型Firebase项目转换为新的、类似的Firestore db,因为它更容易查询,但我遇到了一个简单的查询问题

我试图获取一个集合中的所有文档,如果每个文档都是一个俱乐部,那么集合就是所有俱乐部

在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()以可用数组形式获取文档。仍然似乎效率低下,因为我必须循环处理这些数据,并逐个提取可用信息

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
        })
    })
}

}

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

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

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


循环查询结果是使用CloudFireStore的正确方法

您是否尝试过将您的查询与所有Redux操作的噪音分开计算?这个例子只涉及数据库,而不涉及应用程序状态,更容易进行故障排除。我不明白您试图解决的问题是什么(我在两个代码片段中都没有看到任何循环)。值得一提的是,
querySnapshot.val()
无效,因为Firestore中的querySnapshot上没有.val方法。您可能希望在QuerySnapshot或其他内容中使用.docs作为DocumentSnapshot对象的数组,但您的问题并不清楚。@MichaelLehenbauer我在当前的解决方案尝试中没有使用循环,而是在我的原始帖子中添加了一个我在编辑中提到的循环示例。我能够使用您建议的.docs方法获取DocumentSnapshot对象数组,但在我循环遍历并分别获取每个文档的.data()之前,这些数据似乎不是特别有用。是否有更好的方法将文档中的信息获取到可用的数组中?谢谢。@austinwren您可以做
var clubs=querySnapshot.docs.map(doc=>doc.data())节省一点代码。@MichaelLehenbauer谢谢你!;)是的,这是有道理的,尽管从体验的角度来看,他们当前的API仍然很糟糕。