javascript - 批量获取 DocumentReferences?
问题描述
我正在尝试改进 Firestore 获取功能,我有类似的东西:
return admin.firestore().collection("submissions").get().then(
async (x) => {
var toRet: any = [];
for (var i = 0; i < 10; i++) {
try {
var hasMedia = x.docs[i].data()['mediaRef'];
if (hasMedia != null) {
var docData = (await x.docs[i].data()) as MediaSubmission;
let submission: MediaSubmission = new MediaSubmission();
submission.author = x.docs[i].data()['author'];
submission.description = x.docs[i].data()['description'];
var mediaRef = await admin.firestore().doc(docData.mediaRef).get();
submission.media = mediaRef.data() as MediaData;
toRet.push(submission);
}
}
catch (e) {
console.log("ERROR GETTIGN MEDIA: " + e);
}
}
return res.status(200).send(toRet);
});
第一次得到很好,但性能最差:
var mediaRef = await admin.firestore().doc(docData.mediaRef).get();
我认为这是因为呼叫没有批处理。
是否可以对一组 mediaRefs 进行批量获取以提高性能?
本质上,我有一个文档集合,这些文档的外部引用由指向单独集合中路径的字符串存储,并且事实证明获取这些引用很慢。
解决方案
那这个呢?我做了一些重构以使用更多的等待/异步代码,希望我的评论会有所帮助。
主要思想是使用Promise.all
并等待所有的 mediaRefs 检索
async function test(req, res) {
// get all docs
const { docs } = await admin
.firestore()
.collection('submissions')
.get();
// get data property only of docs with mediaRef
const datas = await Promise.all(
docs.map(doc => doc.data()).filter(data => data.mediaRef),
);
// get all media in one batch - this is the important change
const mediaRefs = await Promise.all(
datas.map(({ mediaRef }) =>
admin
.firestore()
.doc(mediaRef)
.get(),
),
);
// create return object
const toRet = datas.map((data: MediaSubmission, i) => {
const submission = new MediaSubmission();
submission.author = data.author;
submission.description = data.description;
submission.media = mediaRefs[i].data() as MediaData;
return submission;
});
return res.status(200).send(toRet);
}
推荐阅读
- javascript - 使用 Matter.js 创建重力点
- html - 1个div内的2个元素,我希望另一个元素与第一个元素一起缩放
- .net-core - .net Core View 不刷新/更新数据
- android - 获取当前音频输出 Android
- cordova - 从 Cordova/Inappbrowser 创建并保存文件
- java - 膨胀Hashmap的有效方法
> 数据进入 Recyclerview Android - javascript - 尝试将嵌套的 JSON 数据提取到 javascript/尝试消除 JSON 中的键但保留数据
- laravel - 在laravel中发布请求后如何重定向回上一页?
- flask - 如何为我的烧瓶站点获取自定义域
- node.js - 上传文件然后将文件下载到 MongoDB GridFS 时的哈希不匹配