【发布时间】:2018-08-23 11:30:44
【问题描述】:
如何进行查询以获取时间戳在 1519912278 ...1520689878 范围内的所有用户的所有预订?在 Firebase 文档中,它声明我可以查询深度嵌套的子级。
根据这个答案,它应该可以工作 https://stackoverflow.com/a/47805607 ,但它返回 null。
我的用户应用程序的流程是什么? :
1. 用户注册
2. 预订时保存在/Users/UID/stripe_customer_created_with_card/bookingNumber{booking object}
为什么我需要位于 /Users 下的所有预订?:
还有一个专为 Workers 设计的应用程序,它可以观察 /Users 节点,每个工人应该能够根据时间戳从 /Users 获取预订。例如,worker1382 可以读取 /Users 在 2018 年 3 月 16 日至 2018 年 3 月 24 日期间进行的预订。
dbRef = FIRDatabase.database().reference().child("Users")
dbRef.queryOrdered(byChild: "TimeStampDateAndTime")
.queryStarting(atValue: "1519912278")
.queryEnding(atValue: "1520689878")
.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
print(snapshot.value) //returns null
}
Users
UID
cus_CRC50bSq7rXuHv //stripe customer id for the user
617643762 //booking number
TimeStampDateAndTime: "1521309610"
Postcode: "E14 9DS"
BookingNumber:"617643762"
另一个问题:预订对象的父键等于BookingNumber。如果我将父键 617643762 替换为 TimeStampDateAndTime 值 1521309610,我是否能够按时间戳订购预订并最终仅获得在特定范围 1519912278 ...1520689878 内的预订?所以,路径看起来像Users/UID/cus/1521309610: {object goes here}
来自 Firebase 文档
查询也可以由深层嵌套的子级排序,而不是仅向下一层的子级排序。如果您有这样的深层嵌套数据,这将非常有用:
{
"lambeosaurus": {
"dimensions": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
}
},
}
现在要查询高度,我们使用对象的完整路径而不是单个键。 现在,我的问题是,如果我不知道完整路径,我不能做什么?
let ref = Firebase(url:"https://dinosaur-facts.firebaseio.com/dinosaurs")
ref.queryOrderedByChild("dimensions/height").observeEventType(.ChildAdded, withBlock: { snapshot in
if let height = snapshot.value["height"] as? Double {
println("\(snapshot.key) was \(height) meters tall")
}
})
编辑 2
初始结构如下所示:
{
"Users" : {
"I50dHN7wPqPJClPfYDG76gXizdD2" : { //-> user?.uid of a logged in user
"cus_CRC50bSq7rXuHv" : {
"617643762" : {
"TimeStampDateAndTime" : "1521309610"
}
}
}
}
}
修改结构:
{
"Users" : {
"I50dHN7wPqPJClPfYDG76gXizdD2" : {
"1521309610" : { // -> store timeStamp as the immediate child key of UID rather than the booking number
"TimeStampDateAndTime" : "1521309610",
"BookingNumber": "617643762"
}
}
}
}
{
"UsersProfile":{
"I50dHN7wPqPJClPfYDG76gXizdD2":{
"StripeCustomer":"cus_CRC50bSq7rXuHv", // -> store StripeCustomer on the UsersProfile
"Name": "John Doe"
}
}
}
【问题讨论】:
-
好吧,您正在定义 ref,然后观察 finalRef。此外,您的数据结构对于此查询来说太深了一级 - 如果 TimeStampDateAndTime 是 bookings 节点的子节点,它将起作用。
-
虽然 ref 和 finalRef 问题已得到纠正,但问题仍然存在,因为您的 firebase 结构对于该查询来说太深了。您将需要创建一个不同的节点来使用该查询,或者重新构建您当前的结构以支持该查询。 Firebase 支持深度查询,但必须正确构建数据库才能使其正常工作。有关示例结构和支持它的查询,请参阅 this question。
-
Users键是什么?我的意思是 firebase 查询适用于自动生成的密钥。 -
哦,请参阅Deep Query 以获取另一个应该有帮助的问题和答案。在那一个上,查看@frankvanpuffelen 的答案,然后在我的后续答案中查看结构和查询。它是 ObjC,但结构采用适用于深度查询的格式。
-
@TheTiger UID == FIRUser?.uid
标签: swift firebase firebase-realtime-database