2017-10-09 18 views

Odpowiedz

4

Nie ma, będziesz musiał napisać własny skrypt w tym czasie.

+0

czy masz jakieś linki, jak napisać skrypt, dzięki! – Ted

1

Od tej chwili nie można .. firestore tworzy struktury danych w innym formacie niż przy użyciu kolekcji, a każda kolekcja zawiera serię dokumentów, które następnie są przechowywane w formacie JSON. W przyszłości mogą utworzyć narzędzie do konwersji JSON do FireStore .. odniesienia dla sprawdzenia tego na

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

**** EDIT: ****

można zautomatyzować proces do pewnego stopnia, to znaczy napisz fałszywe oprogramowanie, które przesyła tylko pola danych CSV lub JSON do swojej bazy danych Cloud Firestore DB. I przeniesione całe bazy mój making tylko prostą aplikację, która pobrane mojego DB i pchnął go na FireStore

6

Potrzebny jest do tego niestandardowy skrypt.

pisałem jedną oparciu o opiekunie SDK Firebase dopóki Firebase biblioteka nie pozwala importowanie zagnieżdżonych tablic danych.

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

Aktualizacja: napisałem artykuł na ten temat - Filling Firestore with data

15

ogólne rozwiązanie

ja znalazłem wiele nabiera skrypt pozwalający załadować JSON ale żaden z nich dozwolone sub-kolekcje. Powyższy skrypt obsługuje każdy poziom zagnieżdżania i sub-kolekcji. Zajmuje się również przypadkiem, w którym dokument ma własne dane i podzbiory. Jest to oparte na założeniu, że kolekcja to tablica/obiekt obiektów (w tym pusty obiekt lub tablica).

Aby uruchomić skrypt, upewnij się, że masz zainstalowane npm i węzeł. Następnie uruchom swój kod pod numerem node <name of the file>. Uwaga: nie ma potrzeby wdrażania go jako funkcji chmurowej.

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

To zadziałało dla mnie, jest to o wiele lepsze (solidne i ogólne) rozwiązanie niż jeden z Mikki. Użyj tego - konfiguracja jest taka sama, więc wypróbuj albo ten jeden, albo ten z Mikki bardzo łatwo - po prostu zastąpienie rzeczywistego kodu. – inteist

+1

@Maciej Caputa, Twoje rozwiązanie działa świetnie. Dzięki. Czy możesz jednak zasugerować, jak zmodyfikowałbyś fakedb.json tak, by generował auto id, a nie sekwencję - 1, 2, 3, ... – Rinav

+0

@Rinav Możesz mieć tablicę traktowaną jako kolekcję z automatycznym ID lub sekwencja 0,1,2,3 ... Wszystko zależy od struktury twojego pliku JSON. Wszystko sprowadza się do faktu, że tablica na właściwości z parzystą liczbą elementów na ścieżce będzie traktowana jako sekwencja, a jeśli będzie nieparzysta, będzie traktowana jako kolekcja. Zaimplementowałem to w ten sposób, ale zauważ, że jest to zgodne tylko ze specyfikacją Firebase. Zastanawiam się, kiedy Firebase wdroży to w narzędziach firefase. –

Powiązane problemy