我在要返回的节点中运行查询,查询将由包含布尔值的字段排序。根据{{3}}
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}}
为什么没有排序我的值,我该如何解决?谢谢。
答案 0 :(得分:1)
当您对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()));
})
})