【问题标题】:Super simple query in firebase gone wrong (swift)firebase 中的超级简单查询出错(swift)
【发布时间】:2019-03-13 09:13:47
【问题描述】:

我正在尝试基于纪元时间戳做一个简单的有序查询请求:

guard let user = Auth.auth().currentUser?.uid else {return}
let queryRef = Database.database().reference().child("ordersBackup").child(user).queryOrdered(byChild: "pickupCompleteAfter").queryLimited(toFirst: 1)
queryRef.observeSingleEvent(of: .childAdded, with: { (snapshot) in
    print(snapshot.value)
})

结构:

{
  "UserId" : {
    "UniqueId1" : {
      "pickupCompleteAfter" : 1568314979000,
      "name" : "Jeff"
    },
    "UniqueId2" : {
      "pickupCompleteAfter" : 1557687779000,
      "name" : "Stig"
    },
    "UniqueId3" : {
      "pickupCompleteAfter" : "1578855779000",
      "name" : "Ali"
    }
  }
}

它应该返回 UniqueId2。但是,我总是检索与结构相同的顺序,即 UniqueId1、UniqueId2、UniqueId3。它根本不考虑时间戳。我做错了什么?

输出:

LQ8nHi
{
    orderInfo =     {
        deliveryCompleteAfter = 1552917600000;
        deliveryCompleteBefore = 1552924800000;
        pickupCompleteAfter = 156249280000;
        pickupCompleteBefore = 1552492800000;
    };
}
YQxeKv
{
    orderInfo =     {
        deliveryCompleteAfter = 1552917600000;
        deliveryCompleteBefore = 1552924800000;
        pickupCompleteAfter = 1557687779000;
        pickupCompleteBefore = 1552492800000;
    };
}
ibIPO9
{
    orderInfo =     {
        deliveryCompleteAfter = 1553090400000;
        deliveryCompleteBefore = 1553097600000;
        pickupCompleteAfter = 1578855779000;
        pickupCompleteBefore = 1552665600000;
    };
}

【问题讨论】:

  • 如果您获得DataSnapshot 的值,您将丢失有关该值中数据顺序的所有信息。要维护订单信息,您需要循环遍历snapshot.children,如下所示stackoverflow.com/questions/27341888/…stackoverflow.com/questions/41307826/…
  • 感谢您的回答,但我并没有真正关注。 .queryLimited(toFirst: 1) 只返回一个子节点(作为快照),因此遍历 snapshot.children 是没有意义的。我也尝试这样做,结果相同。
  • 当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。啊,我现在看到你在观察.childAdded,这很重要。
  • 您能否编辑您的问题以显示print 语句的输出?
  • 不好意思含糊了,基本上我只想要最高值或者最低值。但它总是返回 firebase 层次结构中第一个节点的值 (UniqueId1)。如果我使用 .queryLimited(toLast: 1),我将得到最后一个节点。我从来没有在pickupCompleteAfter上得到最高值的节点,它根本没有考虑到这一点。

标签: swift firebase firebase-realtime-database


【解决方案1】:

pickupCompleteAfter 嵌套在每个子节点的 orderInfo 节点下。您当前没有告诉数据库该完整路径,因此它只检查每个孩子下方的pickupCompleteAfter

要对orderInfo/pickupCompleteAfter 进行排序/过滤,请使用:

let query = Database.database().reference().child("ordersBackup").child(user)
  .queryOrdered(byChild: "orderInfo/pickupCompleteAfter").queryLimited(toFirst: 1)
query.observeSingleEvent(of: .childAdded, with: { (snapshot) in
    print(snapshot.value)

【讨论】:

  • 同样的问题.. 查询中不包含的唯一子节点是 autoIds,它们是否可能导致问题? Lq8nHi, YQxeKv, iblPO9
猜你喜欢
  • 2011-02-27
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
相关资源
最近更新 更多