如果可能的话,我想要一些帮助,我想在2个foreach语句中进行Firestore复合查询,因为我需要获取与循环数组中的内容相匹配的所有相关数据。
arenas.forEach((arenasElement: any) => {
sports.forEach((sportsElement: any) => {
firebaseAdmin.firestore().collection('leagues')
.where('arenaUid', '==', arenasElement)
.where('sportUid', '==', sportsElement)
.get()
.then((querySnapshot: any) => {
querySnapshot.docs.map((element: any) => {
leaguesArray.push(element.data())
})
})
.catch((error) => {
console.log(error)
res.send(error)
})
})
})
我需要将所有相关结果存储在数组中,因为它们都是对象&我想在所有查询完成后返回该数组,因为我需要所有数据。
我试过看承诺&包装它但我在这件事上没有成功。
欢迎任何帮助!
编辑:上面的答案如下,但我正在努力解决另一项功能
export const getSports = firebaseFunctions.https.onRequest((req: any, res: any) => {
cors(req, res, () => {
let sportsUidArray: any = []
let sportsArray: any = []
let arenas: any = []
let promises: any = []
arenas = req.body.arenas
arenas.forEach((arenasElement: any) => {
promises.push(
firebaseAdmin.firestore()
.collection('leagues')
.where('arenaUid', '==', arenasElement)
.orderBy('title')
.get()
)
})
Promise.all(
promises
).then((querySnapshots: any) => {
querySnapshots.forEach((snapshotElement: any) => {
snapshotElement.docs.map((element: any) => {
sportsUidArray.push(element.data().sportUid)
})
})
sportsUidArray = Array.from(new Set(sportsUidArray))
promises = []
sportsUidArray.forEach((sportIdElement: any) => {
promises.push(
firebaseAdmin.firestore()
.collection('sports')
.doc(sportIdElement)
.get()
)
})
Promise.all(
promises
).then((querySnapshots2: any) => {
querySnapshots2.forEach((snapshotElement: any) => {
/* Issue with line below */
snapshotElement.docs.map((sportsElement: any) => {
sportsArray.push({ id: sportsElement.id, data: sportsElement.data() })
})
})
res.send(sportsArray)
}).catch((err: any) => {
res.send(err)
console.error(err)
})
}).catch((err: any) => {
res.send(err)
console.error(err)
})
})
})
我从Firebase收到错误:
TypeError: Cannot read property 'map' of undefined
答案 0 :(得分:0)
这应该可以解决问题:
var promises = [];
arenas.forEach((arenasElement: any) => {
sports.forEach((sportsElement: any) => {
promises.push(firebaseAdmin.firestore().collection('leagues')
.where('arenaUid', '==', arenasElement)
.where('sportUid', '==', sportsElement)
.get());
})
})
Promise.all(promises).then((snapshots: any) => {
var leaguesArray = [];
snapshots.forEach((querySnapshot: any) => {
querySnapshot.docs.map((element: any) => {
leaguesArray.push(element.data())
})
})
res.send(JSON.stringify(leaguesArray));
})
.catch((error) => {
console.log(error)
res.send(error)
})
您会注意到我的更改非常小:
then()
的代码放入一个then()
代码中,该代码会在加载所有数据(Promise.all()
后)时触发。