Firebase orderByChild意外结果

时间:2016-07-13 07:42:41

标签: 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,
    }
}

检索码

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

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

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

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

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

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

更新

看来对象密钥正在返回数据。如何确保按rating命令退回?

1 个答案:

答案 0 :(得分: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());
    });
});