簡體   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