Firebase,orderByChild未排序

时间:2018-09-17 21:04:49

标签: javascript firebase firebase-realtime-database

我正在尝试使用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'),但没有任何改变。

我现在真的很卡住...也许我忘记了什么?

1 个答案:

答案 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
}