При структурировании данных 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"