Javascript 查询Firestore集合中的所有文档而不进行循环
我一直在致力于将一个小型Firebase项目转换为新的、类似的Firestore db,因为它更容易查询,但我遇到了一个简单的查询问题 我试图获取一个集合中的所有文档,如果每个文档都是一个俱乐部,那么集合就是所有俱乐部 在Firebase,我可以做一些类似的事情: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('
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仍然很糟糕。