【问题标题】:How do I use a document's field from one collection to retrieve another document field from a different collection?如何使用一个集合中的文档字段从不同集合中检索另一个文档字段?
【发布时间】:2020-04-12 05:21:38
【问题描述】:

这是我的数据库的结构: challenges table & users table

这是我得到的错误:error image

我想使用“created_by”字段,它也是 users 表的文档 ID,我想在其中检索显示名称和照片 URL。

我并不完全确定 Promise 是如何工作的,我有一种感觉,这就是我在挣扎的原因,但到目前为止我的代码如下:

数据检索:

UsersDao.getUserData(ChallengesDao.getChallenges().then(result => {return result['author'][0]})).then(result => {console.log(result)})

挑战 DAO:

export default class ChallengesDao {

  static async getChallenges() {
const db = require('firebase').firestore();
    // const challenges = db.collection('challenges').limit(number_of_challenges)
    // challenges.get().then(())

    const snapshot = await db.collection('challenges').get()

    const names = snapshot.docs.map(doc => doc.data().name)
    const createdBy = snapshot.docs.map(doc => doc.data().created_by)
    const highScores = snapshot.docs.map(doc => doc.data().high_score.score)
    return {challengeName: names, author: createdBy, score: highScores}
  }

用户 DAO:

const db = require('firebase').firestore();

export default class UsersDao {
  static async getUserData(uid: string) {
    let userData = {};
    try {
      const doc = await db
        .collection('users')
        .doc(uid)
        .get();
      if (doc.exists) {
        userData = doc.data();
      } else {
        console.log('User document not found!');
      }
    } catch (err) {}
    return userData;
  }
}

【问题讨论】:

  • 如果有任何错误或某些错误,必须显示您的输出,因为我们很容易理解。谢谢

标签: javascript typescript firebase web google-cloud-firestore


【解决方案1】:

你越来越近了。剩下要做的就是为您从 getChallenges 返回的每个 UID 调用 getUserData

将这两者结合起来会是这样的:

let challenges = await getChallenges();
let users = await Promise.all(challenges.author.map((uid) => getUserData(uid));

console.log(challenges.challengeName, users);

这里的新东西是Promise.all(),它结合了许多异步调用,并返回一个在它们全部完成时完成的promise。


您的代码起初对我来说有点奇怪,因为您从getChallenges 返回数据的方式。我建议不要返回具有简单值的三个数组,而是返回一个数组,其中每个对象都有三个值:

  static async getChallenges() {
    const db = require('firebase').firestore();
    const snapshot = await db.collection('challenges').get();

    const challenges = snapshot.docs.map(doc => { name: doc.data().name, author: doc.data().created_by, score: doc.data().high_score.score });

    return challenges;
  }

如果您想将用户 name 添加到此数组中的每个对象,除了已经存在的 UID,您可以这样做:

let challenges = await getChallenges();
await Promise.all(challenges.forEach(async(challenge) => {
  challenge.user = await getUserData(challenge.author);
});

console.log(challenges);

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2023-01-31
    • 1970-01-01
    • 2014-08-16
    • 2023-03-09
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多