Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get records from Firebase where a certain field is empty

Tags:

firebase

I'm building an app where I need to process 5k+ tasks in small batches. For that I have a queue of tasks that is stored in a Firebase. I'd like to be able to pull certain amount of tasks with empty status, update their status and write back.

Currently I don't see how I can pull data where a certain field is empty. Is it possible? If not, what would be the alternative solution?

UPDATED 02/12. Here is the data structure that I have:

{
  "-KAMnc89C5Yi_ef18ewc" : {
    "0": {
      "url": "https://excample.com/url",
      "status": "done"
    },
    "1": {
      "url": "https://excample.com/url1"
    },
    "2": {
      "url": "https://excample.com/ur2"
    },
    "3": {
      "url": "https://excample.com/ur3"
    }
}

And this is the query I'm using:

queueRef.orderByChild('status').equalTo(null).limitToFirst(1).once('value', function(snapshot) {
  console.log(snapshot.val());
});

queueRef points to "-KAMnc89C5Yi_ef18ewc" from the data above.

I expect to get one object - "1", but instead I'm getting all of them. Is there something I'm missing?

like image 758
temkin Avatar asked Oct 19 '25 11:10

temkin


2 Answers

Firebase doesn't allow you to store a property without a value. That simply means that the property doesn't exist.

Luckily this doesn't really matter too much, because this seems to work. Given this data structure:

{
  "-KADbswYg3FiQF78mmUf": {
    "name": "task1",
    "status": "done"
  },
  "-KADbugr7QzTx0s93Fs0": {
    "name": "task2"
  },
  "-KADbvKvBgiAXxnQvoBp": {
    "name": "task3"
  }
}

This works:

ref.orderByChild('status').equalTo(null).once('value', function(snapshot) { 
  console.log(snapshot.val()); 
})

This prints task2 and task3.

like image 140
Frank van Puffelen Avatar answered Oct 21 '25 01:10

Frank van Puffelen


Use the DataSnapshot.exists()

This will returns true if this snapshot contains any data. If not it will return false. According to the documentation here. It is slightly more efficient than using snapshot.val() !== null.

With a data structure like this:

{
  "girlfriend": {
    "first": "Pamala",
    "last": "Anderson"
  }
}

And a firebase call like this:

var ref = new Firebase("https://myURL/girlfriend/Pamala");
ref.once("value", function(snapshot) {
  var a = snapshot.exists();
  // a === true

  var b = snapshot.child("girlfriend").exists();
  // b === true

  var c = snapshot.child("girlfriend/first").exists();
  // c === true

  var d = snapshot.child("girlfriend/middle").exists();
  // d === false (because there is no "name/middle" girlfriend in the data snapshot)
});
like image 28
Fergus Avatar answered Oct 21 '25 01:10

Fergus



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!