从Firestore以json格式检索数据

时间:2018-12-01 10:05:14

标签: angular firebase google-cloud-firestore

我在Firestore文档中发现了这种获取多数据的方法

db.collection("cities").where("capital", "==", true)
.get()
.then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());
    });
})

但是这样,我必须在后端进行两个循环,以处理并将数据推入对象,然后在前端进行另一个循环以显示数据!有什么办法可以逃脱第一个循环并返回数据列表,而无需像这样在后端循环处理

return res.status(200).json(doc.data())
  

答案

.get()
.then(query=>{
    let data = query.docs.map(doc=>{
        let x = doc.data()
            x['_id']=doc.id;
            return x;
    })
    res.status(200).json(data);
})

此答案将返回doc的id作为自身数据的一部分

1 个答案:

答案 0 :(得分:1)

根据https://cloud.google.com/nodejs/docs/reference/firestore/0.17.x/QuerySnapshothttps://cloud.google.com/nodejs/docs/reference/firestore/0.17.x/QueryDocumentSnapshot 没有直接的方法直接将结果作为json对象获取。如果您想要一个数据列表(列表意味着一个数组,那么您将没有ID作为索引),我将使用数组map函数:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/map

return db.collection("cities").where("capital", "==", true)
    .get()
    .then(function(querySnapshot) {
        return querySnapshot.docs.map(doc => {...doc.data(), id: doc.id});
    });

如果您不能使用es6语法,则将{...doc.data(), id: doc.id}替换为

Object.assign(doc.data(), {id: doc.id});

PS:这将返回Promise对象而不是数组本身,因此您将必须在返回的Promise或新的.then()语法上使用await