我只是在探索新的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