使用Firebase每天限制帖子?查询所有数据太慢了?

时间:2016-02-09 09:48:03

标签: javascript database firebase

我可能会想到这一点,但我想尝试采用最好的方法。

基本上我只希望每天发布一定数量的帖子。我将日期作为postedOn键,其值类似于02-09-2016

我正在查询数据,以确保每天最多只有15个帖子。我正是这样做的:

  checkForLessThanFifteen: function(){
    var array = [];
    console.log('checkforless')
    var ref = new Firebase(rootUrl);
    var date = moment().tz("America/Los_Angeles").format('YYYY-MM-DD');
    ref.child('items').once('value', function(snapshot){
      snapshot.forEach(function(childSnapshot){
        if(childSnapshot.val().postedOn === date)
        array.push(childSnapshot.val().songTitle);
      })
      console.log(array.length) //CODE RE ARRAY.LENGTH WILL GO HERE
    })
  }

这是一个合适的方法吗?我担心的是每次尝试发布帖子时都必须解析所有数据。有很多帖子会这么慢吗?有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

@ nicfo的答案将适用于日常情况,但如果您需要多天,将它们放入一个平面阵列将会有点困难。

相反,您可以执行以下数据结构:

{
  "messages": {
    "message_id": {
      "timestamp": 1454832000000
    }
  }
}

然后您可以使用Firebase查询:

var ref = new Firebase('<>/messages');
var startAtDate = new Date(2016, 01, 07).getTime();
var endAtDate = new Date(2016,01, 08).getTime();
var query = ref.orderyByChild('timestamp').startAt(statAtDate).endAt(endAtDate);
query.on('child_added', function(snap) {
  console.log(snap.val()); // data from 02/07/2016
});

这将对指定日期的消息进行范围查询。作为额外的奖励,如果您需要延长日期范围,只需更改startAtendAt参数。

答案 1 :(得分:1)

你现在这样做的方式现在你每次阅读它都会阅读所有帖子。 为避免这种情况,您可以将它们分组:

+ items
    + 02.09.2016
        + post1
        + post2
        + ...
        + post15
    + 02.09.2016
        + post1
        + post2
        + ...
        + post15
    + ...

然后检查当天是否只有15个帖子:

var numberOfPosts = null;
var ref = new Firebase(rootUrl);
checkForLessThanFifteen = function(){
    var date = moment().tz("America/Los_Angeles").format('DD.MM.YYYY');
    ref.child('items').child(date).once('value', function(snapshot){
        numberOfPosts = snapshot.numChildren();
        console.log(numberOfPosts);
        return numberOfPosts;  // <- number of posts on that day.
    }

}