Node.js 使用firebase cloud功能将所有文档从Firestore中的主集合复制到新的子集合

Node.js 使用firebase cloud功能将所有文档从Firestore中的主集合复制到新的子集合,node.js,firebase,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我在firestore有一个主收藏,里面有几百份文档(几个月后会增加到几千份) 我有一个用例,每次在/users/collection中创建一个新的用户文档时,我都希望将主文档中的所有文档复制到/users/{userId}/ 为了实现这一点,我创建了一个firebase云函数,如下所示: // setup for new user exports.setupCollectionForUser = functions.firestore .document('users/{userId}')

我在firestore有一个主收藏,里面有几百份文档(几个月后会增加到几千份)

我有一个用例,每次在/users/collection中创建一个新的用户文档时,我都希望将主文档中的所有文档复制到/users/{userId}/

为了实现这一点,我创建了一个firebase云函数,如下所示:

// setup for new user
exports.setupCollectionForUser = functions.firestore
  .document('users/{userId}')
  .onCreate((snap, context) => {

    const userId = context.params.userId;

    db.collection('master').get().then(snapshot => {

      if (snapshot.empty) {
        console.log('no docs found');
        return;
      }

      snapshot.forEach(function(doc) {

        return db.collection('users').doc(userId).collection('slave').doc(doc.get('uid')).set(doc.data());
      });
    });
 });
这是可行的,唯一的问题是,只需大约200个文档,就需要花费很长时间(~3-5分钟)。这是一个非常糟糕的问题,因为很大程度上取决于这些文档被复制的速度。我希望这不会超过max的几秒钟。而且,文档会完全显示出来,而不是像它们所写的那样,或者至少看起来是那样

我做错什么了吗?为什么要花这么长时间

是否有一种方法可以将此操作分解为多个读写操作,这样我就可以保证在几秒钟内将文档减少到最少,而不必等到所有文档都复制完毕


请告知。

如果我没有弄错,通过正确管理并行写入并返回承诺链,它通常会提高速度

尝试按如下方式调整代码:

exports.setupCollectionForUser = functions.firestore
    .document('users/{userId}')
    .onCreate((snap, context) => {

        const userId = context.params.userId;

        return db.collection('master').get().then(snapshot => {  

            if (snapshot.empty) {
                console.log('no docs found');
                return null;
            } else {

                const promises = [];
                const slaveRef = db.collection('users').doc(userId).collection('slave');
                snapshot.forEach(doc => {

                      promises.push(slaveRef.doc(doc.get('uid')).set(doc.data()))

                });

                return Promise.all(promises);

            }

        });

    });

我建议您观看关于“JavaScript承诺”的3个视频,其中解释了为什么在后台触发的云函数中返回承诺或值是关键


另外请注意,如果您确定要保存在
从属
集合中的文档少于500个,则可以使用。(您可以将其用于500多个文档,但随后您必须管理不同批次的批处理写入…)