首页 文章

什么是firestore参考数据类型适合哪些?

提问于
浏览
88

我正在探索新的Firebase Firestore,它包含一个名为reference的数据类型 . 我不清楚这是做什么的 .

  • 它好像是外键吗?

  • 它可以用来指向位于其他地方的集合吗?

  • 如果 reference 是实际参考,我可以将其用于查询吗?例如,我可以有一个直接指向用户的引用,而不是将userId存储在文本字段中吗?我可以使用此用户参考进行查询吗?

2 回答

  • 46

    引用非常像外键 .

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

    您可以在查询中使用引用,例如任何其他值:用于过滤,排序和分页(startAt / startAfter) .

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

  • 54

    使用Firestore中的引用添加以下对我有用的内容 .

    正如其他答案所说,它就像一把外键 . 但是,引用属性不会返回引用文档的数据 . 例如,我有一个产品列表,其中userRef引用作为产品的一个属性 . 获取产品列表,为我提供了创建该产品的用户的参考 . 但是它没有向我提供该参考中用户的详细信息 . 我之前使用其他后端作为带有指针的服务有一个“populate:true”标志,它给用户提供详细信息而不仅仅是用户的参考ID,这对我来说很有用(希望未来有所改进) ) .

    下面是我用来设置引用以及获取产品列表集合的一些示例代码,然后从给定的用户引用ID获取用户详细信息 .

    Set a reference on a collection:

    let data = { name: 'productName', size: 'medium' }
    data.userRef = db.doc('users/' + firebase.auth().currentUser.uid);
    db.collection('products').add(data);
    

    Get a collection (products) and all references on each document (user details):

    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) });
    

    希望这可以帮助

相关问题