我正在探索新的Firebase Firestore,它包含一个名为reference
的数据类型。我不清楚这是做什么的。
reference
是实际参考,我可以将其用于查询吗?例如,我可以有一个直接指向用户的引用,而不是将userId存储在文本字段中吗?我可以使用此用户参考进行查询吗?答案 0 :(得分:73)
使用Firestore中的引用添加以下对我有用的内容。
正如其他答案所说,它就像一把外键。但引用属性不会返回引用文档的数据。例如,我有一个产品列表,其中userRef引用作为产品的属性之一。获取产品列表,为我提供了创建该产品的用户的参考。但它并没有在该引用中向我提供用户的详细信息。我之前使用过其他后端作为带有指针的服务有一个" populate:true"标志,它返回用户的详细信息,而不仅仅是用户的参考ID,这在这里很棒(希望未来的改进)。
下面是一些示例代码,我用它来设置引用以及获取产品列表集合,然后从给定的用户引用ID中获取用户详细信息。
在集合上设置参考:
let data = {
name: 'productName',
size: 'medium',
userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);
获取每个文档的集合(产品)和所有引用(用户详细信息):
db.collection('products').get()
.then(res => {
vm.mainListItems = [];
res.forEach(doc => {
let newItem = doc.data();
newItem.id = doc.id;
if (newItem.userRef) {
newItem.userRef.get()
.then(res => {
newItem.userData = res.data()
vm.mainListItems.push(newItem);
})
.catch(err => console.error(err));
} else {
vm.mainListItems.push(newItem);
}
});
})
.catch(err => { console.error(err) });
希望这有帮助
答案 1 :(得分:59)
引用非常像外键。
当前发布的SDK无法存储对其他项目的引用。在项目中,引用可以指向任何其他集合中的任何其他文档。
您可以在查询中使用引用,例如任何其他值:用于过滤,排序和分页(startAt / startAfter)。
与SQL数据库中的外键不同,引用对于在单个查询中执行连接没有用。您可以将它们用于从属查找(看起来像是连接),但要小心,因为每一跳都会导致另一次往返服务器。
答案 2 :(得分:2)
根据#AskFirebase https://youtu.be/Elg2zDVIcLo?t=276 目前的主要用例是Firebase控制台UI中的链接
答案 3 :(得分:0)
对于那些希望通过引用进行查询的Javascript解决方案的人-概念是,您需要在查询语句中使用“文档引用”对象
'received'
(对此处的回答表示敬意:https://stackoverflow.com/a/53141199/1487867)