База данных количества значений - PullRequest
0 голосов
/ 27 мая 2018

У меня структура базы данных userDatabase/userID/Customers У меня два клиента.Например, путь:

usersDatabase
    g8voYf1yoChnpmhkoPgtmO4FQT62 - (uid)
        Customers
            Tom Smith (customer with custom ID)
                -LDFZw1tca8KOrnqyyWH - (auto id of customer child)
                    Status of Service: "Open service"
            Ben Thomas (customer with custom ID)
                -LDFZw1tca8KOjgoenBN - (auto id of customer child)
                    Status of Service: "Open service"

Можно ли получить количество значений "Open service" для всех клиентов в моей базе данных?Теперь я знаю только, как распечатать это значение для каждого клиента ...

Мой код для получения значения из базы данных:

let userID = Auth.auth().currentUser?.uid
    let usersDatabaseRef = Database.database().reference().child("usersDatabase").child(userID!).child("Customers")
    usersDatabaseRef.observe(.value, with: { snapshot in
        var totalCustomerCount = 0
        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            let childrenRef = childSnap
            totalCustomerCount += Int(childrenRef.childrenCount)
            print("user \(childSnap.key) has \(childrenRef.childrenCount) customers")

            let userCustomerSnap = childSnap
            for customer in userCustomerSnap.children.allObjects as! [DataSnapshot] {
                let customerSnap = customer
                let dict = customerSnap.value as! [String: Any]

                let stat = dict["Status of Service"] as! String

                let myStatistic = PrintModel(status: stat)
                self.statistic.append(myStatistic)
                print("Statistic: \(String(describing: myStatistic.status))")
            }
        }
        print("... and there are \(totalCustomerCount) total customers")
    })

Например, мой журнал теперь показывает:

  1. пользователь Tom Smith имеет 1 клиентов
  2. Статистика: необязательный («Открытый сервис»)
  3. пользователь Ben Thomas имеет 1 клиентов
  4. Статистика: необязательный («Открыть»сервис ")

но я хочу показать:

  1. Статистика: 2

1 Ответ

0 голосов
/ 28 мая 2018

При структурировании данных Firebase структура обычно основана на том, что вы хотите получить из них.В этом случае данные, которые вы хотите, слишком глубоко внутри размещенной структуры, чтобы быть полезными.Таким образом, изменение структуры сделает это несложно.

Разделите ваши данные на их собственные узлы, денормализуя данные.Подобно этому

users
   uid_0
     //some  info about this user
     open_service_calls
          auto_id_0: true
          auto_id_1: true
   uid_1
     //info about this user

customers
    customer_id_0
      customer_name: "Tom Smith"
      open_service_calls
          auto_id_0: true
    customer_id_1
      customer_name: "Ben Thomas"
      open_service_calls
          auto_id_1: true

service_calls
   auto_id_0
      customer_id: customer_id_0
      user_id: "uid_0"
      status_of_service: "Open service"
   auto_id_1
      customer_id: customer_id_1
      user_id: "uid_0"
      status_of_service: "Open service"

Это позволяет выполнять запросы клиентов, пользователей и решать этот вопрос, легко подсчитывая все открытые службы в базе данных для всех пользователей и клиентов;запрос к service_calls / status_of_service для «Открытого сервиса»

Он также позволяет вам быстро получить доступ ко всем сервисным вызовам, открытым или закрытым для любого пользователя, любого клиента, и даже просто открыть сервисные вызовы для пользователя пользователей.

Дополнительные узлы обеспечат дополнительную гибкость запросов - хранение идентификатора пользователя в узле клиента позволит очень легко запросить всех клиентов для конкретного пользователя, даже если у них нет вызовов службы;все зависит от того, что вы хотите получить от Firebase.

--- Старый ответ ниже ---

За мой комментарий к первоначальному вопросу, этотОтвет включает использование глубокого запроса для запроса дочернего узла дочернего узла клиентов .Идея заключается в том, что в пользовательском узле есть узел Customers, где каждый дочерний ключ является именем клиента, а значение этого узла является парой ключ: значение строки «serviceID», а затем значением, которое может содержать другие дочерние узлы.о сервисе.

Важной частью глубокого запроса является постоянное именование дочерних ключей, которые вы запрашиваете, - в этом случае мы используем ключ 'serviceID', чтобы запрос мог правильно определить путь итогда любой из дочерних узлов этого может быть запрошен: status_of_service, возможно, отметка времени или даже местоположение службы

Первоначальная структура до ее изменения была

Customers
  Tom Cruise
      serviceID
         status_of_service: "Open service"
         //timestamp of service?
         //location of service?
         //other data about service we may need to query?
  Ben Smith
      serviceID:
         status_of_service: "Open service"

Обратите внимание, что для этогоanswer self.ref = my firebase, так что Customers является прямым потомком этого пути.

let ref = self.ref.child("Customers")
let query = ref.queryOrdered(byChild: "serviceID/status_of_service")
               .queryEqual(toValue: "Open service")
query.observeSingleEvent(of: .value, with: { (snapshot) in 
    for child in snapshot.children {
        let snap = child as! DataSnapshot
        print(snap)
    }
})

на выходе получаются два узла customer

   tom_smith
      serviceID
        status_of_service: "Open service"
   another_customer
      serviceID
        status_of_service: "Open service"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...