Je souhaite faire une copie d'une collection dans Firestore lors d'un événement à l'aide des fonctions cloud
J'ai déjà ce code qui itère sur la collection et copie chaque document
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());
});
});
existe-t-il une version plus courte? copier simplement la collection entière à la fois?
Actuellement non. En parcourant chaque document à l'aide des fonctions cloud, puis en définissant un nouveau document sur une collection différente avec les données spécifiées est le seul moyen de le faire. Peut-être que cela ferait une bonne demande de fonctionnalité.
De combien de documents parlons-nous? Pour quelque chose comme 10 000, cela ne devrait prendre que quelques minutes, des sommets.
J'ai écrit un petit extrait de nodejs pour cela.
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));
Il n'y a pas de moyen rapide pour le moment. Je vous recommande cependant de réécrire votre code comme ceci:
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());
})
}