2017-10-04 112 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'和引用就可以做到这一点。 –

相关问题