我希望在使用云功能的活动中在Firestore中制作一个集合的副本
我已经有了这个代码,它遍历集合并复制每个文档
const firestore = admin.firestore()
firestore.collection("products").get().then(query => {
query.forEach (function(doc){
var promise = firestore.collection(uid).doc(doc.data().barcode).set(doc.data());
});
});
有更短的版本吗?一次只复制整个系列?
答案 0 :(得分:10)
为此我写了一个小的nodejs代码段。
const firebaseAdmin = require('firebase-admin');
const serviceAccount = '../../firebase-service-account-key.json';
const firebaseUrl = 'https://my-app.firebaseio.com';
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(require(serviceAccount)),
databaseURL: firebaseUrl
});
const firestore = firebaseAdmin.firestore();
async function copyCollection(srcCollectionName, destCollectionName) {
const documents = await firestore.collection(srcCollectionName).get();
let writeBatch = firebaseAdmin.firestore().batch();
const destCollection = firestore.collection(destCollectionName);
let i = 0;
for (const doc of documents.docs) {
writeBatch.set(destCollection.doc(doc.id), doc.data());
i++;
if (i > 400) { // write batch only allows maximum 500 writes per batch
i = 0;
console.log('Intermediate committing of batch operation');
await writeBatch.commit();
writeBatch = firebaseAdmin.firestore().batch();
}
}
if (i > 0) {
console.log('Firebase batch operation completed. Doing final committing of batch operation.');
await writeBatch.commit();
} else {
console.log('Firebase batch operation completed.');
}
}
copyCollection('customers', 'customers_backup').then(() => console.log('copy complete')).catch(error => console.log('copy failed. ' + error));
答案 1 :(得分:4)
目前,没有。使用云功能循环遍历每个文档,然后使用指定的数据将新文档设置到不同的集合是唯一的方法。也许这会成为一个很好的功能要求。
我们谈论了多少份文件?对于像10,000这样的东西,它只需要几分钟,顶部。
答案 2 :(得分:1)
目前没有快速的方法。我建议您尽管这样重写代码:
import { firestore } from "firebase-admin";
async function copyCollection() {
const products = await firestore().collection("products").get();
products.forEach(async (doc)=> {
await firestore().collection(uid).doc(doc.get('barcode')).set(doc.data());
})
}
答案 3 :(得分:0)
这是我用来将数据复制到另一个集合的方法,我用它来将数据(例如销售或其他东西)从活动集合转移到“销售提要”或“销售历史”集合。
在顶部我引用了文档,底部是非常紧凑的代码。 您可以简单地在顶部添加一个 for 循环以进行 1 个以上的操作。
希望对某人有所帮助:)
DocumentReference copyFrom = FirebaseFirestore.instance.collection('curSells').doc('0001');
DocumentReference copyTo = FirebaseFirestore.instance.collection('sellFeed').doc('0001');
copyFrom.get().then((value) => {
copyTo.set(Map.fromEntries(value.data().entries))
});