2017-10-04 94 views
14

我正在尋找將正在使用Firebase實時數據庫的應用程序數據庫遷移到新的Cloud Firestore數據庫的最佳方法。我對我正在研究的項目非常有信心,我不需要對數據模式進行任何更改,所以我幾乎只是試圖對它進行映射。 Firebase在他們的網站上建議只寫一個腳本來做到這一點,但我不確定最好的解決方法。有沒有人已經完成了這個腳本?將Firebase實時數據庫遷移到Firestore

+0

https://firebase.google.com/docs/firestore/firestore-for-rtdb –

+0

是的,知道鏈接的,但他們基本上只是建議寫一個腳本,但這不是這個問題所要求的。 – Luke

+0

不太可能任何人都會爲此使用通用腳本,因爲它可能會根據每個人的特定用例和要求定製。 –

回答

5

我寫了一個小節點腳本,它以快速和骯髒的方式遷移事物,並且工作得非常好。

如果其他人感興趣,則在下面。

注:這應該只有在實時數據庫中的數據模型是完全平坦的,並沒有太多的嵌套的數據,你打算使用,並保持你的數據持平,以及在公司的FireStore

運行此腳本只需創建一個名爲index.js的節點文件,並將其與實時數據庫導出中的服務帳戶文件和原始json文件一起放入目錄中,然後從命令行運行以下命令。

$ node index.js 

下面的腳本實現。

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

嗨,我已經創建了一個腳本爲同

import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore'; 
import { AngularFireDatabase } from 'angularfire2/database'; 
constructor(private afs: AngularFirestore, private angularfire: AngularFireDatabase) {} 
convert() { 
this.itemsCollection = this.afs.collection('requests');//ref() 
this.angularfire.list('/requests/').auditTrail().subscribe((data: any) => { 
_.each(data, element =>{ 
this.itemsCollection.doc(element.key).set(element.payload.val()) .then((result) => { }); }); });} 
+0

你可以添加步驟來運行這個? – Luke

+0

是 1)配置您的Firebase項目,然後 2)添加到TS文件 從'angularfire2/firestore'導入{AngularFirestore,AngularFirestoreCollection}; 從'angularfire2/database'導入{AngularFireDatabase}; convert(){this.itemsCollection = this.afs.collection('requests'); // ref() this.angularfire.list('/請求/')。auditTrail()。subscribe((data:any)=> {ee(data,element => {this.itemsCollection.doc(element.key).set(element.payload.val )).then((result)=> {});});});} –