我只是在探索新的Firebase Firestore,它包含一個名爲reference
的數據類型。我不清楚這是什麼。什麼是firestore引用數據類型適用於?
- 它是否像外鍵?
- 它可以用來指向位於別處的集合嗎?
- 如果
reference
是一個實際參考,我可以使用它進行查詢嗎?例如,我可以有一個直接指向用戶的引用,而不是將userId存儲在文本字段中?我可以使用此用戶參考進行查詢嗎?
我只是在探索新的Firebase Firestore,它包含一個名爲reference
的數據類型。我不清楚這是什麼。什麼是firestore引用數據類型適用於?
reference
是一個實際參考,我可以使用它進行查詢嗎?例如,我可以有一個直接指向用戶的引用,而不是將userId存儲在文本字段中?我可以使用此用戶參考進行查詢嗎?引用非常像外鍵。
當前發佈的SDK無法存儲對其他項目的引用。在一個項目中,引用可以指向任何其他集合中的任何其他文檔。
您可以在任何其他值的查詢中使用引用:用於過濾,排序和分頁(startAt/startAfter)。
與SQL數據庫中的外鍵不同,引用對於在單個查詢中執行連接沒有用處。您可以將它們用於依賴性查找(看起來像加入),但要小心,因爲每一跳都會導致另一次往返服務器。
在下面添加使用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) });
希望這有助於
感謝分享!我認爲Get part的第一行有一個拼寫錯誤,它應該是'db.collection('products')。get()'。你有沒有嘗試直接獲取用戶?我猜''newItem.userRef.get()'應該工作,而不是'db.collection(「users」)。doc(newItem.userRef.id).get()' –
感謝@CRG錯誤的提取錯誤和是的,在userRef.get()上的好點 - 這是一個更簡單的更乾淨的方式來做到這一點 - 謝謝 –
首先感謝你的例子。 我希望他們會爲未來添加「填充:真實」。否則保存一個參考是沒有意義的。通過簡單地保存'uid'和引用就可以做到這一點。 –
請分享可能的用例嗎?是否有可能查詢該參考中的字段?例如。我有一個列出所有朋友('friends/myId')的'friends'集合。然後,我將該文檔引用到另一個文檔('group/groupId')的'friends'字段中。我只想顯示我在該組中的朋友,做這樣的事情:'where('friends.myId','==',true)'。 – Will
順便說一句,更新[docs](https://firebase.google.com/docs/firestore/manage-data/add-data)以包含添加引用類型的示例可能會很有用。 – Will
我找不到任何有關此信息?這將改變我的整個數據庫結構,我需要知道更多... – Ruben