foreach语句中的Firestore复合查询

时间:2018-02-06 10:44:28

标签: javascript arrays angularjs firebase google-cloud-firestore

如果可能的话,我想要一些帮助,我想在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

1 个答案:

答案 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)
})

您会注意到我的更改非常小:

  1. 使用加载数据的代码创建一个promises数组。
  2. 将您then()的代码放入一个then()代码中,该代码会在加载所有数据(Promise.all()后)时触发。