Firebase Firestore'Reference'数据类型有什么用?

我只是在探索新的Firebase Firestore,它包含一个名为referology的数据类型。我不清楚这有什么作用。

  • 它像外键吗?
  • 它能否用于指向位于其他位置的集合?
  • 如果 是实际引用,是否可以将其用于查询?例如,我是否可以有一个直接指向用户的引用,而不是将 userId 存储在文本字段中?我可以使用此用户引用进行查询吗?reference

答案 1

在下面添加使用Firestore中的引用对我有用的内容。

正如其他答案所说,它就像一个外键。但是,reference 属性不会返回引用文档的数据。例如,我有一个产品列表,其中 userRef 引用是产品上的属性之一。获取产品列表,为我提供了创建该产品的用户的参考。但它没有给我该参考中用户的详细信息。我之前使用过其他后端作为带有指针的服务,这些服务具有“fille: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) });

希望这有帮助


答案 2

引用非常类似于外键。

当前发布的 SDK 无法存储对其他项目的引用。在项目中,引用可以指向任何其他集合中的任何其他文档。

您可以在查询中使用引用,就像任何其他值一样:用于筛选、排序和分页(startAt/startAfter)。

与 SQL 数据库中的外键不同,引用对于在单个查询中执行联接没有用处。您可以将它们用于依赖查找(看起来像是联接),但要小心,因为每个跃点都将导致到另一次到服务器的往返行程。