2017-10-09 131 views

回答

4

沒有,你需要在這個時間寫自己的腳本。

+0

你有什麼關於如何寫腳本的鏈接,謝謝! – Ted

1

不可以.. firestore將數據結構化爲不同的格式,即使用集合,並且每個集合都有一系列文檔,然後以JSON格式存儲..在未來,他們可能會創建一個工具JSON轉換到公司的FireStore ..參考看看這個

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

****編輯:****

最多可以自動化的過程在一定程度上,這是,編寫一個模擬軟件,它只會將CSV或JSON數據的字段推送到您的Cloud Firestore數據庫中。我遷移我的整個數據庫製作我只是其中檢索我的數據庫,並推動其在公司的FireStore

6

你需要一個自定義腳本來做到這一點。

我寫的基礎上,火力地堡管理SDK一個,只要火力庫不允許您導入嵌套數組數據的

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

更新:我寫了一篇關於這個主題的文章 - Filling Firestore with data

15

一般解

我發現許多發生在一個腳本允許上傳的JSON,但沒有允許子集合。我上面的腳本處理任何級別的嵌套和子集合。它還處理文檔具有自己的數據和子集合的情況。這是基於集合是對象的數組/對象(包括空對象或數組)的假設。

要運行該腳本,請確保已安裝npm和節點。然後運行您的代碼爲node <name of the file>。請注意,不需要將其部署爲雲功能。

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

這對我很好,這是一個比Mikki更好的(強大的和一般的)解決方案。使用這個 - 設置是相同的順便說一句,所以你可以很容易地嘗試這個或Mikki的 - 只是替換實際的代碼。 – inteist

+1

@Maciej Caputa,您的解決方案效果很好。謝謝。然而,你可以建議你如何修改fakedb.json,以便它生成自動ID,而不是序列 - 1,2,3,... – Rinav

+0

@Rinav您可以將數組視爲具有自動ID的集合或序列0,1,2,3 ...這一切都取決於您的JSON文件的結構。這一切都歸結爲這樣一個事實:在一個路徑中有偶數個項目的屬性上的數組將被視爲順序,如果奇數,它將被視爲一個集合。我已經實現了這種方式,但請注意,這實際上只符合Firebase規範。我想知道Firebase何時會在Firebase工具中實現此功能。 –