我有一个firestore集合,他的值之一是一组文档ID。 我需要检索集合的所有项目以及存储在数组ID中的所有文档。 这是我收藏的结构
我的代码:
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": []
}
}
}
]
}
响应不包含文档数据
答案 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)
})
})