如何从 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 两个集合中获取数据并将所有数据合并在一起的主要内容,如果未能解决你的问题,请参考以下文章
如何从 2 个集合中读取数据并从两个集合中保存数据并将其保存在 SpringBatch 的第 3 个集合中
如何避免两个不同的线程从DB中读取相同的行(Hibernate和Oracle 10g)