2017-10-09 4 views

Répondre

4

Il n'y a pas, vous aurez besoin d'écrire votre propre script à ce moment.

+0

avez-vous des liens sur la façon d'écrire un script, merci! – Ted

1

Non à partir de maintenant, vous ne pouvez pas .. firestore structure les données dans un format différent qui est, en utilisant des collections et chaque collection a une série de documents qui sont ensuite stockés au format JSON .. à l'avenir ils pourraient faire un outil pour convertir JSON pour FireStore .. pour la vérification des références sur cette

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

**** EDIT: ****

Vous pouvez automatiser le processus jusqu'à une certaine mesure, c'est , écrivez un logiciel fictif qui ne fait que pousser les champs de vos données CSV ou JSON dans votre Cloud Firestore DB. Je migré ma base de données toute ma décision juste une application simple qui récupéré mon DB et poussé sur Firestore

1

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

Cela devrait fonctionner pour un objet d'objets (généralement l'âge JSON firebase est mis en place). Vous pouvez ajouter ce code à une application déjà configurée avec Firestore.

Assurez-vous simplement de le faire pointer vers le bon fichier JSON.

Bonne chance!

6

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

j'ai écrit un basé sur le SDK d'administration Firebase, tant que bibliothèque firebase ne permet pas d'importer vous tableaux imbriqués des 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 - Filling Firestore with data

15

Solution générale

J'ai trouvé beaucoup prend un script permettant de télécharger un JSON, mais aucun d'entre eux sous-collections autorisées. Mon script ci-dessus gère n'importe quel niveau d'imbrication et de sous-collections. Il gère également le cas où un document possède ses propres données et sous-collections. Ceci est basé sur l'hypothèse que la collection est un tableau/objet d'objets (y compris un objet ou un tableau vide).

Pour exécuter le script, assurez-vous que npm et node sont installés. Ensuite, exécutez votre code en tant que node <name of the file>. Notez qu'il n'est pas nécessaire de le déployer en tant que fonctionnalité cloud.

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); 
+2

Cela a fonctionné très bien pour moi, c'est une solution bien meilleure (robuste et générale) que celle de Mikki. Utilisez celui-ci - la configuration est la même chose, donc vous essayez très facilement celui-ci ou celui de Mikki - juste en remplaçant le code réel. – inteist

+1

@Maciej Caputa, Votre solution fonctionne très bien. Merci. Cependant, pouvez-vous suggérer comment modifier fakedb.json pour qu'il génère auto Id, plutôt que séquence - 1, 2, 3, ... – Rinav

+0

@Rinav Vous pouvez avoir un tableau traité comme une collection avec ID automatique ou un sequence 0,1,2,3 ... Tout dépend de la structure de votre fichier JSON. Tout se résume au fait que le tableau sur une propriété avec un nombre pair d'éléments dans un chemin sera traité comme une séquence et, s'il est impair, il sera traité comme une collection. J'ai mis en œuvre de cette façon, mais notez que c'est en fait seulement compatible avec la spécification Firebase. Je me demande quand Firebase implémentera ceci dans les outils de Firebase. –