如何从 firestore 两个集合中获取数据并将所有数据合并在一起

Posted

技术标签:

【中文标题】如何从 firestore 两个集合中获取数据并将所有数据合并在一起【英文标题】:how can get data from firestore two collections and merge all data together 【发布时间】:2021-06-19 06:40:08 【问题描述】:

首先我尝试从排行榜集合中获取数据,然后我尝试获取用户详细信息 并将数据添加到获胜者列表数组中,但它不能按我的意愿工作。

    获奖名单顺序不正确 返回 res.send( 获胜者名单:结果 );部分也不起作用

最好的方法是什么?我在这里做错了什么?我对这个有点陌生,请帮助我 我期待的是包含所有用户详细信息和正确顺序的获胜者列表数组。

const leaderboardsCollectionRef = db.collection('leaderboards');
  const usersCollectionRef = db.collection('users');
  const winnerList = [];


  const promise1 = new Promise((resolve, reject) => 
    leaderboardsCollectionRef.orderBy('weeklyPoints', 'desc').limit(13).get().then(async results => 

      results.forEach(async doc => 
        return new Promise((resolve, reject) => 
          const users = usersCollectionRef.where("uid", "==", doc.id).get().then(async snapshot => 

           snapshot.forEach(async doc => 
              winnerList.push(
                [doc.id]: doc.data()
              );
            );
            resolve(winnerList);
          ).catch(err => 
            functions.logger.error('ERR =>', err);
            reject(err);
          );
        );
      );
    ).catch(err => 
      functions.logger.error('ERR =>', err);
      reject(err);
    );

  );

  Promise.all([promise1])
    .then((result) => 
      console.log('result', result)
      return res.send(
        winnerList: result
      );
    ).catch(err => 
      functions.logger.error('ERR =>', err);
    );

【问题讨论】:

你不能使用await 调用forEach,并且你不应该在其他promise 周围使用new Promise 在您的 users 集合中,您是否使用 UID 作为文档 ID? 是的,我使用 UID 作为文档 ID @Stratubas 【参考方案1】:

假设您将其包装在 async 函数中,我想这会起作用:

const leaderboardsRef = db.collection('leaderboards');
const usersCollectionRef = db.collection('users');
const winnerList = [];

const resultsQuery = leaderboardsRef.orderBy('weeklyPoints', 'desc').limit(13);
const resultsSnapshot = await resultsQuery.get();

const uids = [];
resultsSnapshot.forEach(doc => 
    uids.push(doc.id);
);

for (const uid of uids) 
    const userRef = usersCollectionRef.doc(uid);
    const userSnapshot = await userRef.get();
    winnerList.push( [uid]: userSnapshot.data() );


res.send( winnerList );

【讨论】:

以上是关于如何从 firestore 两个集合中获取数据并将所有数据合并在一起的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:如何从数组中检索数据并将其传递到表中?

如何将我的数据从 Firestore 转换为身份验证用户

引用了 Firestore 如何从另一个集合文档 id 中获取集合值

Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?

如何从 Firebase Firestore 获取数据并将其存储在列表中以在颤振小部件中使用?

Firestore 从集合中获取数组