Firebase Firestore中的'Reference'数据类型有什么好处?

8 浏览
0 Comments

Firebase Firestore中的'Reference'数据类型有什么好处?

我正探索新的Firebase Firestore,并且它包含一种称为reference的数据类型。我不清楚这是什么作用。

  • 这是类似于外键吗?
  • 它可以用来指向某个处于其他地方的集合吗?
  • 如果reference是真实的参考,我可以将其用于查询吗?例如,我可以有一个指向用户的引用,而不是将userId存储在文本字段中吗?并且我可以使用此用户引用进行查询吗?
admin 更改状态以发布 2023年5月24日
0
0 Comments

引用和外键非常相似。

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

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

与SQL数据库中的外键不同,引用对于在单个查询中执行连接不太有用。您可以将它们用于依赖查找(似乎像连接),但要小心,因为每个跳跃将导致向服务器进行另一个往返。

0
0 Comments

以下是我在使用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) });

0