android - firestore教學 - firestore python




將Firebase數據庫轉換為Cloud Firestore (2)

由於數據模型如此不同,因此沒有一種自動的方法來實現這一點。 您需要根據您的應用程序的需要編寫自己的方法。

文檔提供了差異的概述。

願所有人都能通過Firebase獲得有關Cloud Firestore的好消息。

由於我想將我的Firebase數據庫轉換為Cloud Firestore ,有沒有簡單的方法來轉換它?

我想在Cloud Firestore上移動。


當我學習新事物時,我寫自己的指南。 這是我的指南,描述瞭如何將我的實時數據庫遷移到Cloud Firestore。 你可以跳過第一部分。 我在Markdown中編寫,一些代碼標記不會轉換成的標記。 如果您在閱讀時遇到困難,我會通過電子郵件向您發送原始的Markdown版本。 現在我正在將我的控制器更新到Cloud Firestore查詢。

從Firebase實時數據庫遷移到Cloud Firestore

為什麼以及為什麼不,Firebase實時數據庫?

兩年多來,我一直在使用Angular和Firebase。 數據綁定引起了我的注意 - 如果用戶在視圖中更改了數據,數據將立即在控制器和雲數據庫中發生變化。 或者任何其他的事件順序。 我的第一個Firebase項目是一個tic-tac-toe遊戲,其中兩個玩家可以遠程玩,我的點擊立即出現在屏幕上,反之亦然,雲數據庫在兩者之間更新。 (Firebase將此稱為“實時同步客戶之間的同步狀態”。)

我也喜歡Firebase的Auth庫。 使用Facebook,Google,Twitter,GitHub或電話號碼或舊式電子郵件和密碼設置OAuth2用戶登錄非常簡單。

我喜歡不必處理設置和維護服務器。

我喜歡使用NoSQL數據庫。 我使用JavaScript中的對像數組,為什麼不在數據庫中使用相同的數據結構?

我不需要這個,但移動應用程序開發人員可以使用Firebase實時數據庫的離線功能。 當用戶不在服務範圍內時,數據庫可以繼續更新,以便當用戶重新聯機時,他或她可以訪問當前數據。

Plus Firebase具有存儲大型二進製文件(如圖片,音頻和視頻)的功能。

什麼是不喜歡的Firebase實時數據庫? 查詢。 我的狗有這麼多的鄰居女朋友,我需要一個數據庫來跟踪他們。 我想打電話給中國的老闆邀請她過來玩遊戲的日子。 要獲得他們的電話號碼並不容易。 我不能告訴Firebase查看數組dogs ,找到name等於China的對象,並返回字段phone_number 。 我必須告訴Firebase下載整個數組,然後運行forEach循環遍歷每個對象,尋找name === China 。 這被稱為“深層查​​詢”,因為它返回數組中的每個對象,每個子數組以及所有嵌套的子級別。 我的狗有這麼多的女朋友,它可能需要幾秒鐘下載所有!

Firebase實時數據庫具有排序功能,所以我可以下載按名稱,年齡等排列的鄰居排列的狗群。例如,只能篩選五歲以上的狗,但Firebase實時數據庫無法排序過濾。

在Firebase實時數據庫中查找特定對象的關鍵是了解其關鍵。 鍵是類似於-KloeQHDC-mugPjJMAG4輕量級對象。 如果你跟踪一個對象的鍵,你可以很容易地從數據庫中檢索對象。 例如,當新用戶使用Facebook登錄並在Auth數據庫中創建記錄,然後在實時數據庫中創建用戶帳戶時,可以使用戶的身份驗證密鑰成為用戶帳戶中的鍵值對,以便您可以輕鬆找到與此用戶關聯的驗證數據( displayNamephotoURL等)。

有一個用於Auth的數據庫,另一個用於二進製文件存儲,第三個數據庫用於其他所有的數據庫,您有很多密鑰需要跟踪。

對於大數據項目,Firebase實時數據庫有其他限制。 數據只能嵌套32層。 擴大規模需要分片。 如果你的客戶正在做大數據,或者妄想地認為他的5000條記錄是大數據,那麼你就會有一些爭辯說服你的客戶不要在服務器上使用SQL。

為什麼選擇Cloud Firestore?

為什麼? 查詢! 有了雲Firestore,我現在可以查詢我的dogs陣列,請求name等於China的記錄。 Firebase只返回我想要的對象。

Cloud Firestore可以對數據進行排序過濾。

Cloud Firestore可以處理文檔中的子集合。 您可以請求包含文檔子集合的文檔,只需獲取文檔,而不需要其子集合。 即淺查詢。 您甚至可以刪除包含文檔子集合的文檔,並保留子集合。

Cloud Firestore也比Firebase實時數據庫縮放得更好。 安全性更好,還有其他新功能和改進。

注入依賴關係

首先,您需要將Cloud Firestore添加到您的項目中。 在鏈接到Firebase CDN後,在您的index.html文件中,鏈接到Cloud Firestore CDN:

<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase-firestore.js"></script>

或者下載Node模塊並鏈接到它:

npm install [email protected].5.0 --save

如果您在節點服務器上使用Firebase SDK,則還需要添加依賴項:

const firebase = require("firebase");
// Required for side-effects
require("firebase/firestore");

同樣在index.html您需要初始化應用程序:

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

如果您還使用Firebase實時數據庫,存儲和雲消息傳遞,則可以獲得更多內容:

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  databaseURL: "https://###.firebaseio.com",
  messagingSenderId: "###",
  projectId: '### CLOUD FIRESTORE PROJECT ID ###',
  storageBucket: "###.appspot.com"
});

最後,在您的控制器中引用Cloud Firestore:

var db = firebase.firestore();

遷移您的數據

接下來,您需要將您的數據從Firebase實時數據庫遷移到Cloud Firestore。 這很容易。

return firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
  })
});

不要這樣做:

return firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
    db.collection('dogs').set(snapshot); // copy the array to Cloud Firestore
});

後者將復制Firebase實時數據庫密鑰。 由於您無法將收藏集上傳到Cloud Firestore,因此也無法正常工作,只能上傳文檔。

在前面的示例中, forEach循環遍歷每個記錄並將其作為文檔上載到Cloud Firestore。 該集合是自動創建和命名的dogs 。 這也會移除Firebase實時數據庫密鑰,並將其替換為Cloud Firestore密鑰。

return停止在此命令之後執行的任何代碼。 如果要遷移許多數組,則只在最後一個命令上使用return

firebase.database().ref('dogs').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
  })
});

firebase.database().ref('cats').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('cats').doc(childData.cat).set(childData); // each cat is written to Cloud Firestore
  })
});

return firebase.database().ref('cetaceans').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('cetaceans').doc(childData.cetacean).set(childData); // each whale and dolphin is written to Cloud Firestore
  })
});

將數據嵌套到集合和文檔中

Firebase實時數據庫允許您擁有數組中的數組,對像中的對象,對像中的數組或對像中的數組。 Cloud Firebase只允許收藏(數組)中的文檔(對象)和文檔中的收藏。 也就是說,Cloud Firebase數據始終是結構化的集合 - 文檔 - 集合 - 文檔等

也許你想複製一個嵌套的數組到一個子集合:

return firebase.database().ref('dogs').child('girlfriends').once('value') // get a snapshot of the user's data
.then(function(snapshot) { // then execute a promise on the snapshot
  snapshot.forEach(function(childSnapshot) { // iterate through the user's data
    let childData = childSnapshot.val(); // this is the user's data
    db.collection('dogs').doc(childData.word).set(childData); // write the data to Cloud Firestore
    db.collection('dogs').doc('dogs').collection('girlfriends').doc(childData.dog).set(childData);

  })
});

在這裡,我們從數組中獲取數組girlfriends ,通過forEach循環遍歷數組,並將每條記錄寫入一個集合中的girlfriends 。 我同時命名了頂級收藏和頂級文檔。 你可以使用不同的名字。

更新代碼

現在我們開始更新我們的代碼。

更新引用

我們已經更新了一行代碼。 我們更新了Firebase實時數據庫參考:

let ref = firebase.database().ref();

到雲端Firestore:

let db = firebase.firestore();

您現在可以離開Firebase實時數據庫參考,然後註釋掉或在完成後將其刪除。

我有另一個Firebase實時數據庫引用,對我的users數組:

let users = firebase.database().ref('users');

我們將更新到:

let usersFS = firebase.firestore().collection('users');

我們將使用不同的名稱,以便我們可以將兩個數據庫一起運行,直到完成遷移。

更新查詢

現在我們可以開始更新我們的查詢。 在我的控制器中,我的第一個firebase.database().ref查詢是:

firebase.database().ref('userLoginEvent').update({'user': user.uid})

對於Cloud Firestore,我們改為使用:

db.collection('userLoginEvent').doc('HUSEj7dPh8xsOw32feQY').update({'user': user.uid});

除了Cloud Firestore需要在集合中指定文檔之外,代碼幾乎完全相同。 這裡我引用文檔的鍵,因為這個命令總是寫入數據庫中的相同位置。

接下來,我有:

firebase.database().ref('users').child($scope.userAccountKey).update(englishWords);

我們將更新到:

db.collection('users').doc($scope.userAccountKey).update(englishWords);  // this isn't working

誰在市場上將其命名為Cloud FireStore?

那個名字太長了! 查看域名,我看到fire.me仍然可用。 我想知道為什麼沒有人在營銷提出這個簡短,令人難忘的域名?





google-cloud-firestore