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