我正在尝试使用orderByChild对快照进行排序,但此操作不起作用。
防火墙规则:
"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:
db.ref('community/users').orderByChild('films').once('value', snap => {})
在用户数据中,您将检索他的伪(和反),他的电影长度和滤镜长度。
我尝试了orderByChild('pseudoLower')
,.orderByChild('films')
和.orderByChild('pseudoInverseLower')
,但没有任何改变。
我现在真的很卡住...也许我忘记了什么?
答案 0 :(得分:1)
您需要将结果快照转换为子级数组–可以使用快照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
}