web-dev-qa-db-fra.com

Migrer la base de données en temps réel de Firebase vers Firestore

Je recherche le meilleur moyen de migrer ma base de données d'applications qui utilise la base de données en temps réel de Firebase vers la nouvelle base de données Cloud Firestore. Je suis confiant pour le projet sur lequel je travaille, je n'ai pas besoin de modifier le schéma de données, j'essaie donc de le cartographier 1-1. Firebase a suggéré sur leur site de simplement écrire un script pour ce faire, mais je ne suis pas sûr de la meilleure façon de procéder. Quelqu'un a-t-il déjà fait un script pour accomplir cela?

20
Luke

J'ai écrit un petit script de nœud qui a migré les choses d'une manière rapide et sale et cela a très bien fonctionné.

C'est ci-dessous si quelqu'un d'autre est intéressé.

Remarque: cela ne doit être utilisé que si votre modèle de données dans la base de données en temps réel était complètement plat et n'avait pas beaucoup de données imbriquées, et que vous avez l'intention de conserver vos données à plat également dans Firestore

Pour exécuter ce script, créez simplement un fichier de noeud appelé index.js et jetez-le dans un répertoire avec votre fichier de compte de service et votre fichier json brut à partir de l'exportation de la base de données en temps réel et exécutez ce qui suit à partir de la ligne de commande.

$ node index.js

Implémentation du script ci-dessous.

const admin = require('firebase-admin');

var serviceAccount = require("./config.json");
var database = require("./database.json");
var async = require ('async');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

var db = admin.firestore();

var allEntityNames = Object.keys(database);

var asyncTasks = [];

for (var i in allEntityNames) {
  var entityName = allEntityNames[i];
  var entity = database[entityName];
  var entityKeys = Object.keys(entity);

  console.log("began migrating "+ entityName);
  for (var j in entityKeys) {
    var entityKey = entityKeys[j];
    var dict = entity[entityKey];
    asyncTasks.Push(function(callback){
      db.collection(entityName).doc(entityKey).set(dict)
        .then(function() {
          callback();
        })
        .catch(function(error) {
          console.log(error);
          callback();
        });
    });
  }
  async.parallel(asyncTasks, function(){
    console.log("Finished migrating "+ entityName);
  });
}
8
Luke