首页 > 解决方案 > 如何在 Firebase 中按子值排序

问题描述

我有这样的数据:

    scores: {
      uid1: {
        score: 15,
        displayName: "Uciska"
      },
      uid2: {
        score: 3,
        displayName: "Bob"
      },
      uid3: {
        etc...
      }
    }

我想按分数对它们进行排名,只保留前 100 名。

我是按照文档来做到的。但它不起作用。即使分数发生变化,它也总是返回相同的顺序。

    const query = firebase.database().ref('scores')
      .orderByChild('score')
      .limitToLast(100)

      query.on('child_added', snapshot => {
        const score = snapshot.val().score
        console.log(score)
    })

我也在优化规则中添加了这一点,但我不确定它是否正确:

    "scores": {
      ".indexOn": ["score"]
    }

正确的方法是什么?

标签: firebasefirebase-realtime-database

解决方案


您的代码是正确的,应该显示所需的结果。

'child_added'由于“侦听器传递了一个包含新孩子数据的快照”,因此您可能会因为该事件而难以查看结果如文档中所述。

您可以使用以下once()方法,因为它会显示整个分数集,所以会更清楚地显示结果。

    const query = firebase.database().ref('scores')
        .orderByChild('score')
        .limitToLast(100)

    query.once('value', function (snapshot) {
        snapshot.forEach(function (childSnapshot) {
            var childKey = childSnapshot.key;
            var childData = childSnapshot.val();
            console.log(childData);
            // ...
        });
    });

此外,您的规则可以写成".indexOn": "score"因为只有一个参数。


推荐阅读