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

后端 未结 3 1351
情话喂你
情话喂你 2020-12-10 04:17

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(\'u         


        
相关标签:
3条回答
  • 2020-12-10 04:44

    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: 'Snow',
            lastName: 'Jon',
            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.

    0 讨论(0)
  • 2020-12-10 04:46

    It's not supported.

    Depending on the kind of query you need to run on an entity, you will either have to store you jobs by user like @david-east suggested or add a property combining the two properties:

    {
     jobId: 'J123',
     userId: 'provider:123',
     jobIdUserIdIndex: 'J123/provider:12345',
     [...]
    }
    

    But usually, there are no way to allow all the queries you need. You either have to filter objects on the client side, or duplicate the data to created different view of the data; you will have the job data saved at /jobs/$jobId, /users/$userId/jobs/$jobId and maybe /pendingJobs/$jobId.

    I find it's easier to use the orderBy* method only for ordering entities and to duplicate the data to select subsets of them.

    I wish Firebase would support indexes combining multiple properties, but for now you need to build those yourself. However having different views allows to apply different security rules to them: e.g. Only one user should have access to /users/$userId/jobs/, only the admin should have access to /jobs/$jobId.

    0 讨论(0)
  • 2020-12-10 04:51

    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());
    
    0 讨论(0)
提交回复
热议问题