Advanced Firebase Query mit Filter in Swift

Ich komme gerade aus der relationalen Datenbankschule und der Umgang mit JSON-Datenbanken ist für Neueinsteiger keine leichte Aufgabe. Ich habe diese Struktur, um Benutzer zu speichern:

{
  "users" : {
    "0CcKvNkOm5fVqL" : {
      "birthday" : 564688000,
      "country" : "US",
      "email" : "[email protected]",
      "firstName" : "John",
      "gender" : "male",
      "isOnline" : true,
      "lastLoginDate" : 1468166460486,
      "lastName" : "Paul",
      "learningLanguages" : [ {
        "language" : "fr_FR",
        "levelID" : 2
      } ],
      "profileImage" : "https://firebasestorage.googleapis.com/image.jpg",
      "providerID" : "Firebase",
      "registrationDate" : 1468168460486,
      "speakingLanguages" : [ {
        "language" : "es_ES",
        "levelID" : 7
      } ]
    }
  }
}

Ich biete in meiner App einen Suchbildschirm an, in dem Benutzer nach anderen Benutzern suchen und alle diese Filterparameter kombinieren können:

Beispiel

Bekommen10 usersstarting from index 0 wer sind:

maleun von"US"un speaks "da_DK" mitlevelID 2 oder un "fr_FR" mitany levelun lernt "de_DE"withLevel **and/or**learns "ar_AR"withlevel 4`un mitage range between 18 and 24un Sortieren nachisOnline un last login date.

Dies ist eine einfache Aufgabe mit SQL, wenn man annimmt, dass es eine Tabelle mit dem Namen users_languages gibt:

SELECT ...
FROM users AS u
JOIN users_languages AS l
  ON u.id = l.id
WHERE u.gender = "male" 
AND u.age BETWEEN 18 AND 24 // need claculation but let's keep it simple
AND u.country = "US"
AND ((l.language = "de_DE" AND l.mode = "learning" AND l.level = 1) OR (l.language = "ar_AR" AND l.mode = "learning" AND l.level = 4))
....
ORDER BY isOnline, lastLoginDate DESC
LIMIT 0,10

Meine Fragen

Wie kann ich die obige Abfrage mit Firebase mit der tatsächlichen Struktur erstellenWenn es nicht möglich ist, meine Datenbankstruktur für meinen speziellen Anwendungsfall zu verbessern (um die obige Abfrage besser verarbeiten zu können)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage