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

Javascript Firebase.OrderByChild()不适用于布尔值,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在运行一个查询,要返回的节点将由包含布尔值的字段排序。根据 orderByChild 使用orderByChild()时,包含指定子键的数据 订单如下: 对于指定的子键,具有空值的子项首先出现 接下来是指定子键的值为false的子项。 如果多个子项的值为false,则对它们进行排序 按键按字母顺序排列 值为true的儿童对于 接下来是指定的子密钥。如果多个子项的值为 没错,它们是按关键字按字典顺序排序的 下面是我正在使用的树的JSON结构 "boolsTest" : { "nod

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

orderByChild

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

  • 对于指定的子键,具有空值的子项首先出现

  • 接下来是指定子键的值为false的子项。 如果多个子项的值为false,则对它们进行排序 按键按字母顺序排列

  • 值为true的儿童对于 接下来是指定的子密钥。如果多个子项的值为 没错,它们是按关键字按字典顺序排序的

  • 下面是我正在使用的树的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}


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

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

    从数据库返回的结果包含三项内容:

  • 每个匹配节点的值
  • 每个匹配节点的密钥
  • 节点在结果中的顺序
  • 在快照上调用
    .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()));
      })
    })
    

    请将数据结构替换为实际的文本JSON(请不要截图)。您可以通过单击溢出菜单中的“导出JSON”链接来实现这一点(⠇) 关于您的。@FrankvanPuffelen感谢您花时间研究这个问题。我已经添加了JSON结构的编辑。感谢您花时间编写这么好的答案。查询返回JSON数组是有意义的,必须将其视为数组。您的答案与预期完全一致。我非常感谢您的帮助。转到FIREBASE!!再次感谢您的回答,我注意到当我在
    orderByChild()之后添加
    .limitToLast(3)
    时,即使使用解决方案,顺序也似乎不正确。此外,我注意到
    .limitToFirst(3)
    的情况也是一样。添加
    .limitToLast(3)有什么原因吗
    应防止任何类型的排序发生?**(很抱歉,我删除了之前的评论,我的意思是
    .limitToLast(3)
    )不,对查询设置限制不会更改顺序,因为限制是最后应用的(在排序和其他筛选器之后)。因此,肯定还有其他问题。请确保使用
    snapshot.forEach()
    作为
    snapshot.val()
    不会排序(因为JSON对象中键的顺序未定义)。