【问题标题】:How to sort and filter data in Firebase?如何在 Firebase 中对数据进行排序和过滤?
【发布时间】:2018-03-07 00:47:50
【问题描述】:

我想进行查询以获取 bookings 节点下包含子键 TimeStampDateAndTime 的所有子节点,并且子节点的值介于 1519912278 和 1520689878 之间。出于某种原因,即使如下所示的 JSON 对象中键 TimeStampDateAndTime 的值在 1519912278 - 1520689878 这个范围内。

let ref = dbRef.child("Cleaners").child(self.uidOfTextField!).child("bookings").queryOrdered(byChild: "TimeStampDateAndTime").queryStarting(atValue: 1519912278).queryEnding(atValue: 1520689878)

finalRef.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in         
    print("snapshot.value is  line 81 is \(snapshot.value)") //prints (<null>)
}

"Cleaners" : {
    "05MSPgkP1ddhFqXDRjIB4npGEPV2" : {
        "bookings" : {
             "392239680" : {
                  "BookingAmount" : “10”,
                  "BookingCompleted" : "false",
                  "TimeStampDateAndTime" : "1520526600",
           },
       }
   },
 }

【问题讨论】:

  • 试试queryStarting(atValue: 1520526600)看看你会得到什么
  • @PeterHaddad 如果我尝试使用queryStarting(atValue: 1520526600),它就可以工作
  • @bibscy 在queryStarting/queryEnding 中使用时间戳的字符串值怎么样?
  • @EDUsta 如果我尝试.queryStarting(atValue: "1519912278").queryEnding(atValue: 1520689878),它会返回.queryStarting(atValue: "1519912278").queryEnding(atValue: 1520689878)

标签: swift firebase firebase-realtime-database


【解决方案1】:

它给你 null 因为它不存在,你需要做这样的事情:

queryOrdered(byChild: "TimeStampDateAndTime").queryStarting(atValue: 152).queryEnding(atValue: 152\uf8ff)

这会给你所有TimeStampDateAndTime开头有152的人

【讨论】:

  • 问题是键TimeStampDateAndTime的值被保存为字符串而不是Int。所以它是“1520526600”,而不是 1520526600,因此当我们调用 queryOrderedByChild Firebase 时,Firebase 不会推断我们想要订购 Int 值而不是 String,所以我假设结果会有所不同。
  • 它正在工作,我只是想了解它如何影响结果,因为我应该将值保存为 Int 而不是 String。我不想存储为 Int,因为我有很多地方必须更改该变量的类型。这就是为什么我进一步询问结果是否会受到影响。 Firebase 说“字符串在数字之后,并按字典顺序升序排序。”现在我不知道他们如何订购String(Int)
  • 是的,选中此项以在 firebase 中执行 where 子句:stackoverflow.com/questions/26700924/…。我认为,如果您执行“152”,它的行为也会与它知道应该以“152”开头的行为相同。 stackoverflow.com/questions/37798366/…
  • 鉴于我的数据库结构,我想进行查询并观察Cleaners 节点并获取位于路径Cleaner/uid/bookings/bookingNumber 中包含键TimeStampDateAndTime 的所有对象,然后应用像@987654330 这样的过滤方法@问题是每个预订对象都嵌套在每个uid下,我想获取所有满足条件的uid下的所有预订。
  • 请作为一个不同的问题提出更多解释,也许有人会建议您使用适合您的不同数据库结构
【解决方案2】:

"TimeStampDateAndTime" 在您的情况下是一个字符串,因此按它排序不会给出预期的结果。您可以将其类型更改为 Int。

【讨论】:

  • 有什么方法可以在不将数据库中“TimeStampDateAndTime”的类型从String更改为Int的情况下获得预期结果?
  • 如果不更新数据库中的当前值,我不这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2012-01-23
  • 2021-01-09
  • 1970-01-01
  • 2020-11-28
  • 2016-06-15
相关资源
最近更新 更多