Firebase .OrderByChild()不适用于布尔值

时间:2019-01-11 18:32:32

标签: javascript firebase firebase-realtime-database google-cloud-functions

我在要返回的节点中运行查询,查询将由包含布尔值的字段排序。根据{{​​3}}

  

orderByChild

     

使用orderByChild()时,包含指定子键的数据   顺序如下:

     
      
  1. 指定子项的值为空的子项优先。

  2.   
  3. 接下来是指定子项的值为false的子项。   如果多个子项的值为false,则对它们进行排序   在字典上按键。

  4.   
  5. 儿童的值为true   指定的子密钥在下。如果多个孩子的价值为   是的,它们按字母顺序在字典上排序。

  6.   

下面是我正在使用的树的JSON结构

  "boolsTest" : {
    "node1" : {
      "truthValue" : true
    },
    "node2" : {
      "truthValue" : false
    },
    "node3" : {
      "truthValue" : true
    }
  }

然后我在树上运行查询,如下所示

      await admin.database().ref(`boolsTest`).orderByChild("truthValue").once('value').then((value) =>{
          console.log("The values retuned by the query: " + JSON.stringify(value));
          return value;
  }).catch((error) => {
      console.log("The error returned: " + JSON.stringify(error));
      return error
  })
  })

什么结果是按

的顺序无序返回的树的元素
  

查询重新调整的值:{“ node1”:{“ truthValue”:true},“ node2”:{“ truthValue”:false},“ node3”:{“ truthValue”:true}}

为什么没有排序我的值,我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:1)

当您对Firebase数据库执行查询/有序读取时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

从数据库中获得的结果包含三件事:

  1. 每个匹配节点的值
  2. 每个匹配节点的键
  3. 节点在结果中的顺序

在快照上调用.val()时,它将把这三部分信息转换为JSON对象。而且JSON对象中键的顺序是不确定的,因此转换会丢失顺序信息。因此,当您将整个结果当作一个大的JSON对象(如您的代码一样)时,就会丢失有关订单的信息。

为防止这种情况,您应使用Snapshot.forEach()遍历结果:

await admin.database().ref(`boolsTest`).orderByChild("truthValue").once('value').then((snapshot) =>{
  snapshot.forEach((childSnapshot) => {
    console.log("Value retuned by the query: " + JSON.stringify(childSnapshot.val()));
  })
})