簡體   English   中英

如何在滿足條件之前重復 Firestore 查詢?

[英]How can I repeat a Firestore query until a condition is met?

所以我正在將用戶信息存儲在我的數據庫中,除了我從 Firebase 用戶那里獲得的標准數據之外,我還想添加我自己的自定義數據。 我正在為我的每個用戶設置一個個人資料頁面,我想生成一個隨機的 10 位數字作為他們的個人資料 ID。 然后我將它存儲在我的數據庫中以備不時之需。 但是,我需要它們是唯一的數字,並且它們不會重復,所以我試圖查詢數據庫以檢查我生成的 profileID 是否已被使用,如果是,則生成另一個。 但是,除了使用循環之外,我不知道如何在 Firestore 中重復查詢,但這似乎不起作用。

    const usersRef: AngularFirestoreCollection = this.afs.collection('users');

    var query = usersRef.ref.where("profileID", '==', profileID);
    query.get().then((querySnapshot) => {
      if (!querySnapshot.empty) {
        profileID = this.getRandomProfileID();
      }
    })

像這樣的遞歸函數似乎是要走的路:

function getRandomProfileID() {
  return new Promise(function(resolve, reject) {
    var profileID = .... 

    var query = usersRef.ref.where("profileID", '==', profileID);
    query.get().then((querySnapshot) => {
      if (!querySnapshot.empty) {
        this.getRandomProfileID();
      }
      else {
        resolve(profileID);
      }
    })
  })
}

然后你會用以下方式調用它:

getRandomProfileID().then(function(profileID) {
  console.log(profileID);
});

或者,如果您使用的是更現代的 JavaScript 版本:

var profileID = await getRandomProfileID();
console.log(profileID);

正如 Doug 指出的那樣,使用async / await你甚至可以完全不用遞歸函數:

while (true) {
    let profileID = .... 
    let snapshot = await usersRef.ref.where("profileID", '==', profileID).get()
    if (!snapshot.empty) {
        break;
    }
}
console.log("Found unique ID: " + profileID);

但是使用這種方法仍有一些事情需要考慮:

  1. 在您生成並檢查它與實際創建它之間,另一個用戶可能會生成相同的配置文件 ID。 如果這是一個問題,您可能應該為上述功能使用事務,並讓它創建配置文件文檔。 如果這不是一個現實的問題,您仍然應該在安全規則中確保沒有用戶可以覆蓋其他用戶已經創建的文檔。

  2. 如果您打算在很多地方使用自己的配置文件 ID 來標識用戶,請考慮創建一個額外的集合,其中每個文檔名稱/ID 都是配置文件 ID,並且文檔內容是用戶集合的關鍵。 如果您要通過他們的個人資料 ID 唯一標識用戶,請考慮使用個人資料 ID 作為用戶集合中文檔的鍵,而不是您知道使用的任何鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM