2017-07-16 99 views
0

我想從每個用戶名稱值中搜索我的用戶羣。從我在網上看到的人們經常會返回全部用戶然後在表格視圖中過濾它們,但這看起來不切實際也不可行。我的想法是查詢數據並返回指數級數值的數組,但我無法使用提供的查詢方法。高效查詢firebase

如何查詢我的數據庫的特定方面?

我該如何構造我的代碼,使其可行;不會在每個用戶中加載,一次最多爲10個。

任何建議,資源和鏈接非常感謝。

編輯:

我做了一些研究和它看起來像火力地堡帶有一些內置的查詢方法......到目前爲止,這是我試圖用代碼來測試它下面的打印從用戶開始我的,但我不能讓它打印任何用戶在控制檯

ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}") 
     .observe(.childAdded, with: { snapshot in 
      print(snapshot.key) 
     }) 
+0

1)你的問題是過於寬泛。 2)顯示你的嘗試。 3)所有的問題很容易谷歌。 GL –

+0

@VladPulichev我編輯的問題了一下。此外,如果你可以點我到這將是巨大的任何資源。 – Stefan

回答

0

有許多解決方案,並時常加載所有用戶數據的數據過多。

下面是一個典型的用戶節點

users 
    uid_0 
    name: "Jean Luc" 
    uid_1 
    name: "Will" 
    uid_2 
    name: "Geordi" 

一個選擇是通過每個用戶節點,一次一個迭代,以獲取用戶名。這完全避免了龐大的數據集。我們將使用.childAdded事件加載每個和存儲在一個陣列

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    usersRef.observe(.childAdded, with: { snapshot in 
     let userDict = snapshot.value as! [String: Any] 
     let name = userDict["name"] as! String 
     userNamesArray.append(name) 
    }) 

第二選項是對用戶名存儲在一個完全不同的節點,該節點顯著降低了「雜波」爲一體的其餘部分數據保留在主節點的用戶

user_names 
    uid_0: "Jean Luc" 
    uid_1: "Will" 
    uid_2: "Geordi" 

正如你可以用這個結構看,即使有成千上萬個名字,它只是一個非常小的足跡文本。

另一種方法是使用.startingAt和.endingAt一次加載X個用戶,並遍歷返回的用戶以獲取每個名稱。在這種情況下,我們希望所有用戶以A開頭並以M結尾......對不起Worf。

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    let nameQuery = usersRef.queryOrdered(byChild: "name") 
          .queryStarting(atValue: "A") 
          .queryEnding(atValue: "M\u{f8ff}") 
    nameQuery.observe(.value, with: { snapshot in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let userDict = snap.value as! [String: Any] 
      let name = userDict["name"] as! String 
      userNamesArray.append(name) 
     } 
    }) 

的最後一個例子開始以A開頭的用戶名和與用戶名結束了以M結尾+非常高的Unicode字符,這使得它包容了所有的名字開始以M

的\在上面的查詢中使用的uf8ff字符是Unicode範圍中的非常高的代碼點 。因爲它是在 Unicode中最常用的字符之後,所以查詢匹配以queryString開頭的所有值。