我正在运行测试以了解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
}
}
}
;
答案 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
时,整个对象将转换为失去顺序的数组。