Firebase orderByChild意外结果

Mat*_*ebb 1 javascript node.js firebase firebase-realtime-database

我有跟随单个子数据结构,并希望通过子属性检索订单列表rating:

样本数据结构

players: {
    360368: {
        name: "Joe, Blogs",
        rating: 1853
    },
    400017: {
        name: "Bob, Dylan",
        rating: 2597,
    },
    430013: {
        name: "James, Dean",
        rating: 2152,
    }
}
Run Code Online (Sandbox Code Playgroud)

检索代码

let ref = this.fb.ref('players');

ref.orderByChild("rating").limitToFirst(100).once("value", function(snapshot) {
     console.log(snapshot.val());
});
Run Code Online (Sandbox Code Playgroud)

返回的结果似乎没有逻辑数字顺序.

最后,当我运行以下查询时,我得到了我期望的结果(看到10个玩家的评分为2597):

let ref = this.fb.ref('players');

ref.orderByChild("rating").equal(2597).limitToFirst(10).once("value", function(snapshot) {
     console.log(snapshot.val());
});
Run Code Online (Sandbox Code Playgroud)

UPDATE

看来数据是由对象键返回的.如何确保退货,订购rating

Fra*_*len 6

当您value为查询请求事件时,Firebase会返回包含所有子项及其订单信息的快照.但是当您请求该val()快照时,子项将转换为JOSN对象,并且订购信息将丢失.

解决方案是使用快照来导航子项,只有在按正确的顺序获得它们后才能转换为JSON:

let ref = this.fb.ref('players');

ref.orderByChild("rating").equal(2597).limitToFirst(10).once("value", function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
        console.log(childSnapshot.val());
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这是黄金.我整个上午都在寻找这个.快照上的val()事件就是这样一个陷阱:'( (2认同)