Javascript Firebase.OrderByChild()不适用于布尔值
我正在运行一个查询,要返回的节点将由包含布尔值的字段排序。根据 orderByChild 使用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
"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对象中键的顺序未定义)。