web-dev-qa-db-ja.com

Cloud Functions:Firestoreコレクションを新しいドキュメントにコピーする方法は?

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

短いバージョンはありますか?コレクション全体を一度にコピーするだけですか?

9
Khaled

現在、ありません。これを行う唯一の方法は、Cloud Functionsを使用して各ドキュメントをループし、指定されたデータを使用して新しいドキュメントを別のコレクションに設定することです。おそらく、これは優れた機能のリクエストになるでしょう。

話しているドキュメントはいくつですか? 10,000程度の場合は、数分で終わります。

8
rayfarer

これのために小さな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));
2
Lahiru Chandima

現在のところ、速い方法はありません。ただし、次のようにコードを書き直すことをお勧めします。

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