2017-12-18 146 views
0

如何获取按日期字段值排序的数据?我想根据他们的开始现在()的字段值显示所有事件?我不认为这会很难,但我无法让它正常工作。Firebase按日期排序的值从今天开始不起作用

我的火力点的数据是:

"events" : { 
     "-KwX5oG6TYNWWhLYC5rx" : { 
     "ends" : "2018-01-04T23:30:47.071Z", 
     "starts" : "2018-01-02T23:30:47.062Z", 
     "title" : "Event 1" 
     }, 
     "-L0Id2D34D2Sd2T5oyXX" : { 
     "ends" : "2017-12-27T23:30:39.566Z", 
     "starts" : "2017-12-26T23:30:39.552Z", 
     "title" : "Event 2" 
     } 
    } 

的代码查询火力数据:

const today = new Date().toISOString(); 
    const ref = FirebaseRef.child("events").orderByChild('starts').startAt(today); 

    return ref.on('value', (snapshot) => { 
    const events = snapshot.val() || {}; 

    // DO SOMETHING 
    }); 

我试图存储数据Unix时间戳以及代替ISO字符串,仍然没有奏效。

+0

有什么不好的结果,当你运行该代码? –

+0

排序按升序排列。看起来你正在通过“今天”,除非你有将来的日子,否则它将不会返回。要降序排列,您需要获取所有值并将其排序为JavaScript函数。 – SynchroDynamic

+0

@FrankvanPuffelen我看到的是一个没有排序的列表。事件没有按照降序和升序显示。 – partizan

回答

1

最有可能的问题是由于您对查询结果做了snapshot.val()的事实。当您从Firebase数据库请求有序数据时,您会得到三件事:密钥,值和项目顺序。

当您在快照上调用val()时,将返回该值的JSON表示形式,该表示形式仅具有键和值的空间。由于JSON对象中的属性顺序未定义,因此结果的顺序未定义(尽管大多数浏览器按键显示它们)。

为了解决此问题,使用Snapshot.forEach()遍历结果的快照:

return ref.on('value', (snapshot) => { 
    var events = []; 
    snapshot.forEach((child) => { 
    events.push(child.val()); 
    }); 
    console.log(events); 
}); 
+0

看起来像这样!我发现一个小的语法错误,'=>'缺失,即(孩子)=> {}等等。谢谢弗兰克。 – partizan

+0

感谢您的支持!本周我一直在用我的胖箭头sl sl。 :-) –