javascript - 批量获取DocumentReferences?

标签 javascript typescript firebase google-cloud-firestore

我正在尝试改进 firestore get 功能,我有类似的东西:

    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 - 批量获取DocumentReferences?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50840302/

相关文章:

javascript - HTML5 JavaScript 中 Flash 的 BitmapData.hitTest() 的等价物

html - 在 webpack 中导入 html 文件时找不到模块错误

javascript - 数组在 JavaScript 函数之外未定义?

javascript - 如何在 Rhino 中创建 'real' JavaScript 数组

javascript - 在整个网站上连续运行 jQuery 动画

javascript - jQuery focus() 页面滚动长度

javascript - 如何将复杂的 JSON 值映射到简单对象数组

typescript - Jest 不转换导入的 typescript

ios - Firebase:如何在 iOS 应用程序被终止并重新启动后保留用户提要

android - 从 Android 设备卸载应用程序时如何使用 Firebase 以编程方式检测?