Javascript Firebase、orderByChild未排序
我正在尝试使用orderByChild对快照进行排序,但此功能不起作用 FIREBASE规则:Javascript Firebase、orderByChild未排序,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在尝试使用orderByChild对快照进行排序,但此功能不起作用 FIREBASE规则: "rules": { "community": { "users": { ".read": true, "$uid": { ".read": true, ".write": "$uid === auth.uid", ".indexOn": ["pseudo", "pseudoLower", "pseudoInverse
"rules": {
"community": {
"users": {
".read": true,
"$uid": {
".read": true,
".write": "$uid === auth.uid",
".indexOn": ["pseudo", "pseudoLower", "pseudoInverseLower", "films"]
}
}
}
}
数据:
"community" : {
"users" : {
"Ab" : {
"films" : 200,
"filters" : 2,
"id" : "Ab",
"pseudoBase" : "AB",
"pseudoInverseLower" : "zy",
"pseudoLower" : "ab"
},
"Bc" : {
"films" : 692,
"filters" : 4,
"id" : "Bc",
"pseudoBase" : "King",
"pseudoInverseLower" : "prmt",
"pseudoLower" : "king"
},
"Ce" : {
"films" : 100,
"filters" : 5,
"id" : "a",
"pseudoBase" : "A",
"pseudoInverseLower" : "z",
"pseudoLower" : "a"
}
}
}
JS:
在用户数据中,您将检索他的伪长度(以及相反的长度)、他的胶片长度和过滤器长度
我尝试了orderByChild('pseudoLower')
、.orderByChild('films')
和.orderByChild('pseudoInverseLower')
,但没有改变
我真的被困在这一点上。。。可能我忘了什么?您需要将生成的快照转换为子项数组–这可以使用snapshot
forEach
方法完成,这将按照查询中提供的子项顺序迭代子项。如果打印快照值,用户将丢失接收到的顺序
async function getCommunityUsers(filter) {
const usersRef = admin.database().ref('community/users')
const snapshot = await usersRef.orderByChild(filter).once('value')
let users = []
snapshot.forEach(child => {
users.push({
key: child.key,
...child.val()
})
return false
})
return users
}
当你说它不起作用时,我不知道你的意思。您是否可以更新您的问题,以包括您期望发生的事情和正在发生的事情?似乎只有在使用子事件类型时,
orderByChild
才起作用。@Callam:不是这样的orderByChild
适用于您选择收听的任何事件类型。嘿,Josselin。您共享的代码尚未对快照执行任何操作。所以很难说到底出了什么问题。也就是说,根据过去的经验,我认为你们并没有维持秩序。如果是这样,Callam的答案就是你的解决方案。
async function getCommunityUsers(filter) {
const usersRef = admin.database().ref('community/users')
const snapshot = await usersRef.orderByChild(filter).once('value')
let users = []
snapshot.forEach(child => {
users.push({
key: child.key,
...child.val()
})
return false
})
return users
}