2017-10-04 31 views
49

我只是在探索新的Firebase Firestore,它包含一個名爲reference的數據類型。我不清楚這是什麼。什麼是firestore引用數據類型適用於?

  • 它是否像外鍵?
  • 它可以用來指向位於別處的集合嗎?
  • 如果reference是一個實際參考,我可以使用它進行查詢嗎?例如,我可以有一個直接指向用戶的引用,而不是將userId存儲在文本字段中?我可以使用此用戶參考進行查詢嗎?

回答

26

引用非常像外鍵。

當前發佈的SDK無法存儲對其他項目的引用。在一個項目中,引用可以指向任何其他集合中的任何其他文檔。

您可以在任何其他值的查詢中使用引用:用於過濾,排序和分頁(startAt/startAfter)。

與SQL數據庫中的外鍵不同,引用對於在單個查詢中執行連接沒有用處。您可以將它們用於依賴性查找(看起來像加入),但要小心,因爲每一跳都會導致另一次往返服務器。

+6

請分享可能的用例嗎?是否有可能查詢該參考中的字段?例如。我有一個列出所有朋友('friends/myId')的'friends'集合。然後,我將該文檔引用到另一個文檔('group/groupId')的'friends'字段中。我只想顯示我在該組中的朋友,做這樣的事情:'where('friends.myId','==',true)'。 – Will

+45

順便說一句,更新[docs](https://firebase.google.com/docs/firestore/manage-data/add-data)以包含添加引用類型的示例可能會很有用。 – Will

+6

我找不到任何有關此信息?這將改變我的整個數據庫結構,我需要知道更多... – Ruben

15

在下面添加使用Firestore中的引用爲我工作的內容。

正如其他答案所說,它就像一個外鍵。引用屬性不會返回引用文檔的數據。例如,我有一個產品列表,其中userRef引用是產品上的一個屬性。獲取產品清單後,我可以爲創建該產品的用戶提供參考。但它並沒有給我參考文獻中用戶的細節。我已經使用其他後端作爲帶指針的服務,之前有一個「填充:真」標誌,它向用戶提供了詳細信息,而不僅僅是用戶的引用標識,這對於我們來說非常有用(希望未來可以改進)。

下面是一些示例代碼,我用於設置引用以及獲取產品列表的集合,然後從給定的用戶引用ID獲取用戶詳細信息。

坐落在一個集合的引用:

let data = { name: 'productName', size: 'medium' } 
data.userRef = db.doc('users/' + firebase.auth().currentUser.uid); 
db.collection('products').add(data); 

獲取集合(產品),並在每個文檔(用戶詳細信息)的所有引用:

db.collection('products').get() 
    .then((res) => { 
     vm.mainListItems = []; 
     res.forEach(doc => { 
     var newItem = doc.data(); 
     newItem.id = doc.id; 
     if (newItem.userRef) { 
      newItem.userRef.get() 
      .then(res => { newItem.userData = res.data() }) 
      .catch(err => console.error(err)); 
     } 
     vm.mainListItems.push(newItem); 
     }); 
    }) 
    .catch((err) => { console.error(err) }); 

希望這有助於

+1

感謝分享!我認爲Get part的第一行有一個拼寫錯誤,它應該是'db.collection('products')。get()'。你有沒有嘗試直接獲取用戶?我猜''newItem.userRef.get()'應該工作,而不是'db.collection(「users」)。doc(newItem.userRef.id).get()' –

+0

感謝@CRG錯誤的提取錯誤和是的,在userRef.get()上的好點 - 這是一個更簡單的更乾淨的方式來做到這一點 - 謝謝 –

+4

首先感謝你的例子。 我希望他們會爲未來添加「填充:真實」。否則保存一個參考是沒有意義的。通過簡單地保存'uid'和引用就可以做到這一點。 –

相關問題