从ID数组中获取Firestore文档列表

时间:2020-05-21 07:51:27

标签: node.js typescript firebase google-cloud-firestore google-cloud-functions

我有一个firestore集合,他的值之一是一组文档ID。 我需要检索集合的所有项目以及存储在数组ID中的所有文档。 这是我收藏的结构 enter image description here

我的代码:

export const getFeaturedMixes = functions.https.onRequest((request, response) => {
    let result:any[] = []
    featuredMixes.get().then(mixesSnap => {

        mixesSnap.forEach(doc => {
            let docId = doc.id
            let ids = doc.data().tracks

            let resultTracks:any[] = []
            ids.forEach(id => {
                let t = tracksCollection.doc(id.track_id).get()
                resultTracks.push({'id' : id.track_id, 'data': t})
            })
            result.push({'id':docId, 'tracks': resultTracks})
        })
        return result
    })
    .then(results => {
        response.status(200).send(results)
    }).catch(function(error) {
        response.status(400).send(error)
    })
});

,我得到以下答复:

{
        "id": "Xm4TJAnKcXJAuaZr",
        "tracks": [
            {
                "id": "FG3xXfldeJBbl8PY6",
                "data": {
                    "domain": {
                        "domain": null,
                        "_events": {},
                        "_eventsCount": 1,
                        "members": []
                    }
                }
            },
            {
                "id": "ONRfLIh89amSdcLt",
                "data": {
                    "domain": {
                        "domain": null,
                        "_events": {},
                        "_eventsCount": 1,
                        "members": []
                    }
                }
            }
    ]
}

响应不包含文档数据

2 个答案:

答案 0 :(得分:0)

get()方法是异步的,并返回Promise。因此,您无法执行以下操作:

operator >

您需要等待get()方法返回的Promise解析,以便能够使用if (data > in) {(这是DocumentSnapshot)。

为此,由于要并行获取多个文档,因此需要使用Promise.all()

以下应该可以解决问题。请注意,该代码尚未经过测试,您仍然可以轻松完成一部分代码,请参阅最后的注释。如果您在定型时遇到问题,请将新代码添加到问题中。

 ids.forEach(id => {
      let t = tracksCollection.doc(id.track_id).get()
      resultTracks.push({'id' : id.track_id, 'data': t})
 })

答案 1 :(得分:0)

感谢 Renaud Tarnec !真的很希望能得到您的答案,功能已经可以使用,但是我还是想返回Promise.all(primises)一些对象,该对象将 mix 与他的曲目一起保存,因为现在很难构建then函数中的新对象, 这是我的最后一个功能

    const mixIDs: any[] = [];
    const mixes:any[] =[]

    featuredMixes.get()
        .then(mixesSnap => {
            const promises:any[] = []

            mixesSnap.forEach(doc => {
                let mixId = doc.id
                let mix = createMix(doc)
                mixes.push(mix)

                doc.data().tracks.forEach(track => {
                    let promise = tracksCollection.doc(track.track_id).get()
                    promises.push(promise)
                    mixIDs.push(mixId)
                })
            })
            return Promise.all(promises)
        })
        .then(tracksSnapshot => {

            let buildedTracks = tracksSnapshot.map((doc, idx) => {
                let mId = mixIDs[idx]
                return createTrack(doc, mId)
            })

            let result = mixes.map(mix => {
                let filterTracks = buildedTracks.filter(x => x.mix_id === mix.doc_id)
                return Object.assign(mix, {'tracks': filterTracks})
            })
            response.status(200).send(result)
        })
        .catch(function (error) {
            response.status(400).send(error)
        })
})