【问题标题】:'startAt' and 'endAt' is not filtering the data using angularfire2 4.0.0'startAt' 和 'endAt' 没有使用 angularfire2 4.0.0 过滤数据
【发布时间】:2018-03-18 20:23:38
【问题描述】:

这是我的 Firebase 中的结构:

"receipts" : {
"-L7ug4xPoZYvk72Pynjh" : {
  "date" : "18-2-2018",
  "name" : "ABC",
  "price" : 50,
  "product" : "1122",
  "quantity" : 1
},
"-L7ug5phx4x7OUA8Pyxa" : {
  "date" : "18-3-2018",
  "name" : "XYZ",
  "price" : 50,
  "product" : "1122",
  "quantity" : 1
}

我正在使用 angularfire 2 版本 4.0.0。我想使用startAtendAt 结合orderByChild"date" 来限制结果。我正在使用以下代码,但它返回数据库中存在的所有数据:

getFullReceipts(dateFrom, dateTo) {
 console.log(dateFrom); //dateFrom = 3-3-2018
 console.log(dateTo);   //dateTo = 31-3-2018
 return this.afData.list('receipts', {
  query: {
    orderByChild: 'date',
    startAt: dateFrom,
    endAt: dateTo
  }
});

}

此代码应仅返回一条日期为18-3-2018 的记录,但返回所有记录。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database angularfire2


    【解决方案1】:

    存储日期的字符串格式不容易排序。由于 Firebase 会对这些字符串进行字符串比较,因此它们与您的预期结果不匹配。如果我们在不涉及 Firebase 的情况下用纯 JavaScript 重现问题,这是最容易看到的:

    var dates = [
      "18-2-2018",
      "18-3-2018"
    ];
    
    var dateFrom = "3-3-2018"
      , dateTo = "31-3-2018"
      ;
      
    dates.forEach(function(date) {
      if (date < dateFrom) console.log(date+" is before "+dateFrom);
      if (date > dateFrom) console.log(date+" is after "+dateFrom);
      if (date < dateTo) console.log(date+" is before "+dateTo);
      if (date > dateTo) console.log(date+" is after "+dateTo);
      if (date >= dateFrom && date <= dateTo) console.log(date+" is within range");
    });

    考虑将它们存储在 ISO-8601 format 中,例如2018-03-032018-03-31。或者将它们存储为时间戳,它们是数字的(自纪元以来的毫秒数),这没有这个问题。

    var dates = [
      "2018-02-18",
      "2018-03-18"
    ];
    
    var dateFrom = "2018-03-03"
      , dateTo = "2018-03-31"
      ;
    
    dates.forEach(function(date) {
      if (date < dateFrom) console.log(date+" is before "+dateFrom);
      if (date > dateFrom) console.log(date+" is after "+dateFrom);
      if (date < dateTo) console.log(date+" is before "+dateTo);
      if (date > dateTo) console.log(date+" is after "+dateTo);
      if (date >= dateFrom && date <= dateTo) console.log(date+" is within range");
    });

    【讨论】:

    • 我尝试使用2018-3-18 格式。它可以解决问题,但现在唯一的问题是,当我选择 2018-3-3 这样的日期时,它不会返回任何内容,但如果我选择 2018-3-1,firebase 会返回结果。 @弗兰克
    • 对于您的第一条评论:请注意,在我的示例中,日期用前导 0 填充以始终保持相同的长度,否则它将不起作用。但时间戳也是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多