代码之家  ›  专栏  ›  技术社区  ›  TheRedCamaro3.0 3.0

firebase.orderByChild()不适用于布尔值

  •  0
  • TheRedCamaro3.0 3.0  · 技术社区  · 7 年前

    我正在运行一个查询,要返回的节点将由一个包含布尔值的字段进行排序。根据 Firebase Documentation

    秩序儿童

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

    1. 具有指定子键的空值的子项优先。

    2. 对于指定的子键,值为false的子项位于下一个。 如果多个子项的值为false,则对它们进行排序。 按键在词典中。

    3. 值为“真”的孩子 下一个是指定的子键。如果多个子项的值为 是的,它们按键按字典顺序排序。

    下面是我正在使用的树的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”:真,“node2”:“truthvalue”:假,“node3”:“truthvalue”:真

    为什么我的值没有被排序,我该如何解决这个问题?谢谢您。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Frank van Puffelen    7 年前

    对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()));
      })
    })
    
    推荐文章