首页 > 解决方案 > 我有一个要搜索 Cloud Firestore 的运动列表(数组)。但是,数组的大小会有所不同

问题描述

我有一系列运动,我想用它来查询 Cloud Firestore,但数组的大小可能不同。有时会查询一项运动,有时会查询两项运动,等等。它就像数组包含,但相反。我有一个数组,我想看看这些项目是否在数据库中。我知道我可以链接 .where(),但是如何根据数组中的项目数动态更改它?

我将如何在 Firestore 查询中实现它?我会将运动数组映射到 where(sport '==' SPORT_NAME_HERE) 吗?

以下是针对单个运动(字符串)的查询:

let sportsQuery = await database.collection('sports')
                        .where('sport', '==', 'SPORT_NAME_HERE')
                        .orderBy('sport_team')
                        .limit(7)

这就是我的想法。完全不确定是否允许使用 .then ,但到目前为止这是我的解决方案: let sports = ['golf', 'tennis', 'basketball'];

 let sportsQuery = await database.collection('sports')
     .then(
       sports.map(sport => {
         .where('sport', '==', `${sport}`)
       })
     )
     .orderBy('sport_team')
     .limit(7)

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


您应该按照以下几行组合几个查询。由于我们想要并行执行可变数量的查询,我们使用Promise.all()

  var database = firebase.firestore();

  const sports = ['golf', 'tennis', 'basketball'];

  const promises = [];

  sports.forEach(function(element) {
    const sportsQuery = database
      .collection('sports')
      .where('sport', '==', element)
      .orderBy('sport_team')
      .limit(7)
      .get();

    promises.push(sportsQuery);
  });

  Promise.all(promises).then(function(results) {
    //results is an array of QuerySnapshots, since the get() method returns a QuerySnapshot
    results.forEach(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log(doc.id, ' => ', doc.data());
        //It's up to you to possibly populate an array here, that you may sort later on
      });
    });
  });

推荐阅读