Comment importer CSV ou JSON dans firebase cloud firestore

y a-t-il un moyen d'importer CSV ou JSON dans firebase cloud firestore comme dans la base de données en temps réel firebase?

enter image description here

26
demandé sur Dan McGrath 2017-10-09 10:33:25

7 réponses

Solution Générale

j'ai trouvé beaucoup de prises sur un script permettant de télécharger un JSON mais aucune d'entre elles n'a permis de sous-collections. Mon script ci-dessus gère tous les niveaux de nidification et de sous-collections. Il traite également le cas où un document possède ses propres données et sous-collections. Ceci est basé sur l'hypothèse que collection est tableau/objet d'objets (y compris un objet vide ou tableau).

pour lancer le script, assurez-vous que vous avez npm et node installés. Alors exécutez votre code comme node <name of the file>. Remarque, il n'est pas nécessaire de le déployer comme un nuage d'une fonction.

const admin = require('../functions/node_modules/firebase-admin');
const serviceAccount = require("./service-key.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<your-database-name>.firebaseio.com"
});

const data = require("./fakedb.json");

/**
 * Data is a collection if
 *  - it has a odd depth
 *  - contains only objects or contains no objects.
 */
function isCollection(data, path, depth) {
  if (
    typeof data != 'object' ||
    data == null ||
    data.length === 0 ||
    isEmpty(data)
  ) {
    return false;
  }

  for (const key in data) {
    if (typeof data[key] != 'object' || data[key] == null) {
      // If there is at least one non-object item then it data then it cannot be collection.
      return false;
    }
  }

  return true;
}

// Checks if object is empty.
function isEmpty(obj) {
  for(const key in obj) {
    if(obj.hasOwnProperty(key)) {
      return false;
    }
  }
  return true;
}

async function upload(data, path) {
  return await admin.firestore()
    .doc(path.join('/'))
    .set(data)
    .then(() => console.log(`Document ${path.join('/')} uploaded.`))
    .catch(() => console.error(`Could not write document ${path.join('/')}.`));
}

/**
 *
 */
async function resolve(data, path = []) {
  if (path.length > 0 && path.length % 2 == 0) {
    // Document's length of path is always even, however, one of keys can actually be a collection.

    // Copy an object.
    const documentData = Object.assign({}, data);

    for (const key in data) {
      // Resolve each collection and remove it from document data.
      if (isCollection(data[key], [...path, key])) {
        // Remove a collection from the document data.
        delete documentData[key];
        // Resolve a colleciton.
        resolve(data[key], [...path, key]);
      }
    }

    // If document is empty then it means it only consisted of collections.
    if (!isEmpty(documentData)) {
      // Upload a document free of collections.
      await upload(documentData, path);
    }
  } else {
    // Collection's length of is always odd.
    for (const key in data) {
      // Resolve each collection.
      await resolve(data[key], [...path, key]);
    }
  }
}

resolve(data);
28
répondu Maciej Caputa 2018-03-03 19:43:14

Vous avez besoin d'un script personnalisé pour le faire.

j'en ai écrit un basé sur le SDK admin Firebase, aussi longtemps que la bibliothèque firebase ne pas autoriser vous à importer tableaux imbriqués de données.

const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./service-key.json");

const data = require("./data.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://YOUR_DB.firebaseio.com"
});

data && Object.keys(data).forEach(key => {
    const nestedContent = data[key];

    if (typeof nestedContent === "object") {
        Object.keys(nestedContent).forEach(docTitle => {
            admin.firestore()
                .collection(key)
                .doc(docTitle)
                .set(nestedContent[docTitle])
                .then((res) => {
                    console.log("Document successfully written!");
                })
                .catch((error) => {
                    console.error("Error writing document: ", error);
                });
        });
    }
});

mise à Jour: j'ai écrit un article sur ce sujet - remplir Firestore de données

10
répondu Mikki 2017-11-09 17:32:39

il n'y en a pas, vous aurez besoin d'écrire votre propre script pour le moment.

6
répondu Dan McGrath 2017-10-09 14:28:44

j'ai utilisé la Solution générale fournie par Maciej Caputa. Merci (:

voici quelques conseils. En supposant que vous avez une application de base de feu ionique installée avec les modules de noeud de base de feu requis dans le dossier des fonctions à l'intérieur de cette solution. Il s'agit d'une installation ionique Standard Firebase. J'ai créé un dossier d'importation de tenir le script et les données au même niveau.

Hiérarchie Des Dossiers

myIonicApp
    functions
        node_modules
            firebase-admin
ImportFolder
    script.js
    FirebaseIonicTest-a1b2c3d4e5.json
    fileToImport.json

Script Paramètres

const admin = require('../myIonicApp/functions/node_modules/firebase-admin'); //path to firebase-admin module
const serviceAccount = require("./FirebaseTest-xxxxxxxxxx.json"); //service account key file

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://fir-test-xxxxxx.firebaseio.com" //Your domain from the hosting tab
});

Domain name from the Hosting tab

Création du Compte de Service de Clé de Fichier

  • dans la console Firebase pour votre projet, à côté du projet Overwiew item, cliquez sur l'icône d'engrenage et sélectionnez Utilisateurs et les autorisations
  • au bas de l'écran, cliquez permission Avancée les paramètres

Accessing Google Cloud Platform Console

  • ceci ouvre un autre onglet pour la Console de la plate-forme Cloud de Google
  • à gauche, sélectionnez l'élément comptes de Service
  • créer un compte de Service pour un compte de Service existant

j'ai simplement ajouté une touche à l'Application de Moteur de compte de service par défaut

la fonction Create key permet de télécharger la clé d'un fichier JSON

Creating the Service Account Key

Structure des données JSON

pour utiliser le script fourni, la structure de données doit être comme suit:

{
  "myCollection" : {
    "UniqueKey1" : {
      "field1" : "foo",
      "field2" : "bar"
    },{
    "UniqueKey2" : {
      "field1" : "fog",
      "field2" : "buzz"
    }...
}
4
répondu pasx 2018-06-06 12:30:42

Pour référence. J'ai écrit une fonction qui aide à importer et exporter des données dans Firestore.

https://github.com/dalenguyen/firestore-import-export

2
répondu Dale Nguyen 2018-03-06 15:20:54

https://gist.github.com/JoeRoddy/1c706b77ca676bfc0983880f6e9aa8c8

cela devrait fonctionner pour un objet d'objets (généralement l'ancien firebase json est configuré). Vous pouvez ajouter ce code à une application qui est déjà configurée avec Firestore.

assurez-vous simplement que vous l'avez pointé vers le bon fichier JSON.

Bonne chance!

1
répondu Joe Roddy 2017-10-25 16:45:50

Pas de maintenant, vous ne pouvez pas.. firestore structure les données dans un format différent, c'est-à-dire en utilisant des collections et chaque collection possède une série de documents qui sont ensuite stockés dans le format JSON.. à l'avenir, ils pourraient faire un outil pour convertir JSON en firestore.. pour référence check this out

:https://cloud.google.com/firestore/docs/concepts/structure-data

****EDIT:****

Vous pouvez automatiser le processus jusqu'à une certaine mesure, c'est, Ecrivez un logiciel simulé qui ne pousse que les champs de vos données CSV ou JSON dans votre base de données Cloud Firestore. J'ai migré toute ma base de données Mon faire juste une application simple qui a récupéré ma base de données et l'a poussée sur Firestore

1
répondu Anubhav Malik 2018-01-25 09:36:45