Извлечение данных из базы Firebase, где пользовательская корневая коллекция ссылается на одноуровневую коллекцию - PullRequest
0 голосов
/ 24 сентября 2019

Доступ ко всем картам отлично работает в Firebase с этим путем, однако он захватывает все карты, доступные в корневой коллекции «Карт».

let yourMapRef = Database.database().reference().child("Maps")

Я пытаюсь получить доступ только ккарты, частью которых является пользователь.Поэтому я пытался следовать стековым вопросам и учебникам по Firebase, но я не могу понять, как это сделать.

Например, я бы хотел, чтобы Адам только взял свои модерируемые карты на

let yourMapRef = Database.database().reference().child("users/\(userProfile.uid)/Maps")

Как мне обойти эту проблему и как ее можно решить?

Пользователи (структура корневой коллекции)

{
  "4g99cMTM4begwooORsO4EKNV456" : {
    "username" : "Adam",
    "Maps" : {
      "-LpYo_pQ8zIOGHHlNU1Q" : true
    }
  },
  "6g55cHXH4begwooHQvO4EKNV3xm1" : {
    "username" : "Ellen",
    "Maps" : {
      "-LpY4XEER-b21hwMi9sp" : true
    }
  }
}

Карты (структура корневого набора)

{
  "-LpY4XEER-b21hwMi9sp" : {
    "mapmoderators" : {
      "6g55cHXH4begwooHQvO4EKNV3xm1" : true
    },
    "mapphotoURL" : "https://firebasestorage.googleapis.com/v0/b/...",
    "mapusername" : "Hello World"
  },
  "-LpYo_pQ8zIOGHHlNU1Q" : {
    "mapmoderators" : {
      "4g99cMTM4begwooORsO4EKNV456" : true
    },
    "mapphotoURL" : "https://firebasestorage.googleapis.com/v0/...",
    "mapusername" : "Dream"
  }
}

1 Ответ

1 голос
/ 25 сентября 2019

Итак, сначала вы хотите получить пользователей, а затем использовать их в отношении коллекции карт, чтобы проверить, модерируют ли они карту или нет:

func getUsers() {
    let userRef = Database.database().reference().child("users").child(currentUserID)
    userRef.observeSingleEvent(of: .value, with: { (snapshot) in

      let root = snapshot.value as? Dictionary

      if let mapsByUser = root["Maps"] as? [String: Bool] {
          for (documentId, status) in mapsByUser {
              if status {
                  // Document is true, check for the maps
                  self.getMaps(key: documentId, owner: currentUserID)
              }
          }
      }
      }) { (error) in
        print(error.localizedDescription)
    }
}

// Check for maps
func getMaps(key:String, owner:String) {
    let userRef = Database.database().reference().child("maps").child(key)
    userRef.observeSingleEvent(of: .value, with: { (snapshot) in

        let user = snapshot.value as? Dictionary

        if let mapsByUser = user["mapmoderators"] as? [String: Bool] {
            for (userId, status) in mapsByUser {
                if userId == owner && status == true {
                    print("Owner \(owner) manages this \(user)")
                }
            }
        }

      }) { (error) in
        print(error.localizedDescription)
    }
}

Для проверки этого вызовите getUsers() в viewDidLoad..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...