Cloud Functions:如何将 Firestore Collection 复制到新文档?

Cloud Functions: How to copy Firestore Collection to a new document?

我想在发生事件时使用 Cloud Functions 在 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());
  });
});

有没有更短的版本?一次复制整个集合?

目前没有。使用 Cloud Functions 循环遍历每个文档,然后将新文档设置为具有指定数据的不同集合是执行此操作的唯一方法。也许这会提出一个很好的功能请求。

我们在谈论多少文档?对于像 10,000 这样的东西,应该只需要几分钟,tops。

我为此写了一个小的 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));

暂时没有快捷方式。不过,我建议您像这样重写代码:

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());
    })
}

这是我用来将数据复制到另一个集合的方法,我用它来将数据(如销售或其他)从活动集合转移到 'sells feed' 或 'sells history' 集合。

上面是我参考的文档,下面是比较紧凑的代码。 您可以简单地在顶部添加一个 for 循环以进行 1 次以上的操作。

希望对大家有所帮助:)

DocumentReference copyFrom = FirebaseFirestore.instance.collection('curSells').doc('0001');
DocumentReference copyTo = FirebaseFirestore.instance.collection('sellFeed').doc('0001');

copyFrom.get().then((value) => {
  copyTo.set(value.data())
});