firebase Query.orderBy *返回无序列表

时间:2019-01-01 21:39:04

标签: javascript firebase firebase-realtime-database

我正在运行测试以了解Firebase查询的行为。

这是返回传递给它的查询的常规函数​​:

function logVal( query , tag ){
    return query.on('value', function(snapshot) {
         console.log( tag , snapshot.val());
    });
}

在此测试示例中,返回的列表与我的原始数据相同,没有排序!。

sRef = firebase.database().ref("students");
logVal ( "orderByChild" , sRef.orderByChild("bio") ) ;
logVal ( "orderByChild" , sRef.orderByChild("chem") ) ;
logVal ( "orderByChild" , sRef.orderByChild("physics") ) ;
logVal ( "orderByKey",  sRef.orderByKey());
logVal ( "orderByValue" , sRef.orderByValue() );

这是我的模型数据

{
   students: {


  "fahd": {
      "physics": 9,
      "chem"   : 2,
      "bio"    : 0
  }
     ,
     "nasser": {
         "physics": 8,
         "chem"   : 7,
         "bio"    : 6
     }

     ,

     "ahmad": {
      "physics": 7,
      "chem"   : 5,
      "bio"    : 9
    },
    "ali": {
        "physics": 9,
        "chem"   : 9,
        "bio"    : 9
    }
    ,
     "hus": {
         "physics": 10,
         "chem"   : 5,
         "bio"    : 6
     }

   }
}
;

2 个答案:

答案 0 :(得分:2)

调用snapshot.val()时,结果将转换为JSON对象。而且,按定义,对象中的属性顺序是不确定的。

因此,如果要按顺序显示结果,则需要使用snapshot.forEach进行处理:

return query.on('value', function(snapshot) {
  snapshot.forEach(function(child) {
     console.log( tag , child.val());
  });
})

第二个问题是orderByValue仅在子节点具有原始值时才起作用。由于users下的节点本身就是JSON对象,因此它们没有可以排序的值,因此,这些节点将以未指定的顺序返回。

答案 1 :(得分:0)

我找到了部分解决方案:

将logVal函数更改为时:

key: value

在orderByChild方法中输出是不同的。它成功地根据传递的密钥的值来安排学生:ex version: '2.4' x-base-environment: &base-environment FOO: BAR x-base-template: &base-template image: alpine command: env environment: *base-environment # This is only necessary if you want variables in base-template x-custom-template-1: &custom-template1 <<: *base-template environment: <<: *base-environment FOO2: BAR2 services: service-1: <<: *custom-template1

它仍然在function logVal( tag, query ){ return query.on('value', function(snapshot) { console.log(tag) snapshot.forEach(function(snapshot) { var val = snapshot.val(); console.log("student: " + snapshot.key + "bio: " + val.bio + "physics: " + val.physics + " chem: " + val.chem ) }); }); } chem中返回相同的数据模型。

原始logVal函数中的错误,可能是因为字典对象是未排序的对象。因此,当我们调用orderByKey时,整个对象将转换为失去顺序的数组。