javascript - 在不循环的情况下查询 Firestore 集合中的所有文档

标签 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() 获取可用数组中的文档。似乎仍然效率低下,因为我不得不遍历文档并一一提取可用信息。

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 对象。因此,您可以通过 key 访问第一级节点(以及通过 key 访问任何级别节点)

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

循环查询结果是使用 Cloud Firestore 的正确方法。

关于javascript - 在不循环的情况下查询 Firestore 集合中的所有文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676772/

相关文章:

reactjs - 如何在样式组件中使用 {withTheme}。?任何人请给出实时示例

node.js - Git Bash 安装 React-Scripts 时出错 "UNKNOWN: unknown error, scandir ' E :\. ..\node_modules\@babel\.helper-annotate-as-pure.DELETE'"

android - 使用 token 的 Firebase 身份验证

javascript - Firebase:如何获取和设置全局索引计数器?

javascript - 订阅前运行函数

javascript - 如何选择当前元素应用悬停效果?没有继承

node.js - 如何在 NextJS SSR 中存储和获取 access_token

javascript - 云函数 - 更新 onUpdate 触发器内的文档变量。可能的?

javascript - 指令相互干扰

javascript - 使用 jquery 内联编辑链接 - 防止在编辑时单击它们