Firebase how to index this data to be fetched? -
i have db users
, items
.
every user has languages
, array of languages, example ['en', 'ar']
every item has language
, string, example 'en'
.
how can index items, such can list of last x items in array of languages? (i.e - latest 5 items either 'en' or 'ar')
for single language solution simple - have index has language key, , array of item keys ordered whatever.
please note firebase official documentation recommends against using arrays
. imho, main problem in project trying use array, anti-pattern when comes firebase
. beside that, 1 of many reasons firebase recommends against using arrays makes security rules impossible write. because firebase database structured pairs of key , values, best option use map
.
to achieve want, recomand using database structure looks this:
firebase-root | --- users | | | --- uid1 | | | | | --- languages | | | | | --- languageid1: true | | | | | --- languageid2: true | | | --- uid2 | | | --- languages | | | --- languageid3: true | | | --- languageid4: true | --- languages | | | --- languageid1 | | | | | --- languagename: "en" | | | | | --- items | | | | | --- itemid1: true | | | --- languageid2: "ar" | | | | | --- languagename: "ar" | | | | | --- items | | | | | --- itemid2: true | --- item | --- itemid1 | | | --- title: "itemtitleen" | | | --- en: true | --- itemid2 | --- title: "itemtitlear" | --- ar: true
now, database structure can achieve want. example, can query database display languages database. can display languages of single user.
if want query database last x item have language set en
, need put listener on items
node , create query using functions like: orderbychild()
, equalsto()
, limittolast()
. such query should this:
query = rootref.child("items") .orderbychild("en") .equalsto(true) .limittolast(5) .addlistener(/* ... */)
edit: unfortunately firebase not allow multiple conditions in query. in firebase there no clause sounds this: where language = "en" , language = "ar"
. solve this, need put listener on other node, on languages
node.
the flow follows:
yourref = rootref.child("languages"); //only 1 listener yourref.addlistener( 1. create list 2. items datasnapshot.child("languageid1").child("items").getchildren() 3. add **en** items list 4. items datasnapshot.child("languageid2").child("items").getchildren() 5. add **ar** items list 6. display list contains data both languages )
hope helps.
Comments
Post a Comment