Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase - How do I write multiple orderByChild for extracting data?

I'm looking to get data where two fields equal what I'm passing in.

Here's an example of my code:

this.refApp
  .orderByChild('userUid')
  .startAt(uid).endAt(uid)
  .orderByChild('jobId')
  .startAt(jobId).endAt(jobId)
  .on('value', (snap) => {
     //This currently doesn't get returned.
  });   

In the above example I don't get any compiler errors and code seems fine. However, I hard coded the data so that it would return an object where uid and jobid are equal to.

I can get this to work for one orderByChild but when I do two like above it doesn't seem to do anything.

like image 927
AngularM Avatar asked Dec 19 '15 20:12

AngularM


2 Answers

You can only use one ordering method.

To query more, you'll need to rethink your data structure. Your current structure probably looks something like this:

{
  "key": {
     "id_1": {
        "userUid": "user_1",
        "jobId": "job_1"
     },
     "id_2": {
        "userUid": "user_1",
        "jobId": "job_2"
     },
     "id_3": {
        "userUid": "user_2",
        "jobId": "job_3"
     }
  }
}

With this structure you're limited to index off of one child key.

Now consider this structure:

{
   "key": {
      "user_1": {
         "id_1": {
            "jobId": "job_1",
            "userUid": "user_1"
         },
         "id_2": {
            "jobId": "job_2",
            "userUid": "user_1"
         }
      }
      "user_2": {
         "id_3": {
            "jobId": "job_3",
            "userUid": "user_2"
         }
      }
   }
}

This structure explicitly creates an index on uid. So now if you want to get all the jobs by user you can write this query:

var ref = new Firebase('<my-firebase-app>');
var uid = 'user_1';
var userRef = ref.child('key').child(uid);
var query = userRef.orderByChild('jobId');
query.on('value', (snap) => console.log(snap.val());
like image 123
David East Avatar answered Oct 25 '22 13:10

David East


An other way to do kind of multiple orderByChild in Firebase is to create an orderKey.

Imagine you have this in your base:

{
    userId: {
        firstName: 'Jon',
        lastName: 'Snow',
        birthYear: 283
    }
}

And you want to query: userRef.orderByChild('firstName').equalTo('Jon').orderByChild('lastName').equalTo('Snow')

You need to create a key on your user like this:

{
    userId: {
        firstName: 'Snow',
        lastName: 'Jon',
        birthYear: 283,
        orderName: 'JonSnow'
    }
}

So you can query like this: userRef.orderByChild('orderName').equalTo('JonSnow')

This also works with startAt and endAt if you want to query all the Snow born in a range of years. You first create the key:

{
    userId: {
        firstName: 'Snow',
        lastName: 'Jon',
        birthYear: 283,
        orderNameYear: 'Snow283'
    }
}

So you can query: userRef.orderByChild('orderNameYear').startAt('Snow280').endAt('Snow285')

This will return all Snow born between 280 and 285.

like image 29
GuySake Avatar answered Oct 25 '22 14:10

GuySake