如何从Firebase获取某个字段为空的记录

时间:2016-02-11 04:16:11

标签: firebase

我正在构建一个应用程序,我需要小批量处理5k +任务。为此,我有一个存储在Firebase中的任务队列。我希望能够以空状态提取一定数量的任务,更新状态并回写。

目前我看不到如何在某个字段为空的情况下提取数据。可能吗?如果没有,那么替代解决方案是什么?

更新02/12 。这是我的数据结构:

{
  "-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"
    }
}

这是我正在使用的查询:

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

queueRef从上面的数据中指向"-KAMnc89C5Yi_ef18ewc"

我希望得到一个对象 - “1”,但我得到了所有这些对象。有什么我想念的吗?

2 个答案:

答案 0 :(得分:6)

Firebase不允许您存储没有值的属性。这仅仅意味着财产不存在。

幸运的是,这并不重要,因为这似乎有效。鉴于此数据结构:

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

这有效:

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

这会打印task2task3

答案 1 :(得分:2)

使用 DataSnapshot.exists()

如果此快照包含任何数据,则返回true。如果不是,它将返回false。根据文件here。它比使用snapshot.val()!== null。

更有效

使用这样的数据结构:

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

这样的firebase调用:

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)
});