Node.js 使用firebase cloud功能将所有文档从Firestore中的主集合复制到新的子集合
我在firestore有一个主收藏,里面有几百份文档(几个月后会增加到几千份) 我有一个用例,每次在/users/collection中创建一个新的用户文档时,我都希望将主文档中的所有文档复制到/users/{userId}/ 为了实现这一点,我创建了一个firebase云函数,如下所示: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}')
// 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多个文档,但随后您必须管理不同批次的批处理写入…)