Alex Ironside
Alex Ironside

Reputation: 5059

Query firebase to return if value more than number

I want to get data from Firebase.

This is more or less my data structure:

"Reports" : {
    "N06Jrz5hx6Q9bcVDBBUrF3GKSTp2" : 2,
    "eLLfNlWLkTcImTRqrYnU0nWuu9P2" : 2
},
"Users":{
    "N06Jrz5hx6Q9bcVDBBUrF3GKSTp2" : {
        "completedWorks" : {
            ...
        },
        "reports" : {
            "-LHs0yxUXn-TQC7z_MJM" : {
                "category" : "Niewyraźne zdjęcie",
                "creatorID" : "z8DxcXyehgMhRyMqmf6q8LpCYfs1",
                "reportedID" : "N06Jrz5hx6Q9bcVDBBUrF3GKSTp2",
                "resolved" : false,
                "text" : "heh",
                "workID" : "-LHs-aZJkAhEf1RHVasg"
            },
            "-LHs1hzlL4roUJfMlvyA" : {
                "category" : "Zdjęcie nie przedstawia zadania",
                "creatorID" : "z8DxcXyehgMhRyMqmf6q8LpCYfs1",
                "reportedID" : "N06Jrz5hx6Q9bcVDBBUrF3GKSTp2",
                "resolved" : false,
                "text" : "",
                "workID" : "-LHs-aZJkAhEf1RHVasg"
            }
        },
        "userType" : "company",
        "verified" : true
    },
}

So as you can see the number of reports is listed in the Reports part. How can I make Firebase return only the ids of the users where the report number is over or equal 3?

Something like this (this will not work, but I hope kind of shows what I was thinking about):

firebase.database().ref('Reports').orderBy(whatHere?).moreThen(2).on('value', snap => {

Is this even doable like this? If yes how could I do it? I want to grab the IDs of the users where reports are >= 3

Upvotes: 0

Views: 3141

Answers (2)

Himanshu
Himanshu

Reputation: 12685

There are two options for doing that but not exactly the way you wants. You have to use javascript for further processing. One is to use limitToLast after using order by. which will give the last numbers from the result.

firebase.database().ref('Reports').orderBy(reportid).limitToLast(2).on('value', snap => {

Or use startAt and endAt to skip and fetch the result as offset which can provide the data between two reportId.

firebase.database().ref('Reports').orderBy(reportid).
          .startAt(reportIdStart)
          .endAt(reportIdLast)
          .limitToLast(15)

According Firebase documentation:

Using startAt(), endAt(), and equalTo() allows you to choose arbitrary starting and ending points for your queries

To filter data, you can combine any of the limit or range methods with an order-by method when constructing a query.

Unlike the order-by methods, you can combine multiple limit or range functions. For example, you can combine the startAt() and endAt() methods to limit the results to a specified range of values.

For more information go through documentation on filtering data

Upvotes: 0

Frank van Puffelen
Frank van Puffelen

Reputation: 599706

You're looking for orderByValue():

firebase.database().ref('Reports').orderByValue().startAt(3).on('value', snapshot => {
  snapshot.forEach(reportSnapshot => {
    console.log(reportSnapshot.key);
  })
})

Also check out the Firebase documentation on ordering data.

Upvotes: 2

Related Questions