繁体   English   中英

如何获取创建文档的用户的数据

[英]How to get the data of a user who created a document

我有两个 collections,一个用于注册属性,一个用于注册用户。

注册属性的集合称为listings ,注册用户的集合称为users

我使用参数listingId访问listings集合中的文档,该参数是文档 ID。

我通过传入的参数从文档中获取数据:

const fetchListing = async () => {
    const docRef = doc(db, 'listings', listingId)
    // response
    const docSnap = await getDoc(docRef)

    if (docSnap.exists) {
        listing = docSnap.data()
    }   
}

我需要获取创建文档的用户的字段(名称、email、twitter 等)。 我该怎么做呢?

每个文档都有创建它的用户的 ID。

在此处输入图像描述

您必须执行以下操作:

  1. 使用data()方法返回的 Object 获取用户 ID 值(如文档中所述,“此方法将文档中的所有字段作为对象检索”)。
  2. 获取与此用户 ID 对应的文档(与获取列表文档完全相同),然后获取此文档的数据(再次使用data()方法)。

  const fetchListing = async () => {
    const docRef = doc(db, 'listings', listingId);
    const docSnap = await getDoc(docRef);

    if (docSnap.exists) {
      const userId = docSnap.data().user;

      const userDocRef = doc(db, 'users', userId);
      const userDocSnap = await userDocRef(docRef);

      if (userDocSnap.exists) {
        const userName = docSnap.data().name;
        const userEmail = docSnap.data().email;
        // ...
      }
    }
  };

请注意,在 NoSQL 世界中,您的用例的一种常见方法是对您的数据进行非规范化处理,以便您以最少的查询次数在前端获取所有必要的数据。 这是一篇关于 NoSQL 数据建模方法的“著名” 帖子

更具体地说,这意味着在每个列表文档中,您将复制其作者/创建者的数据。

这种方法的一个副作用是您需要保持值同步(即用户文档中的值和列表文档中的值)。 如果修改了用户文档,则可以通过触发 Cloud Function 来完成此同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM