如何进行查询以获取时间戳在1519912278 ... 1520689878范围内的所有用户的所有预订?在Firebase文档中,它声明我可以深入查询嵌套的子项。
根据这个答案,它应该有效https://stackoverflow.com/a/47805607,但它返回null。
我的用户应用程序的流程是什么? :
1.用户唱歌了
2.预订时,保存在/ Users / UID / stripe_customer_created_with_card / bookingNumber {预订对象}
为什么我需要位于/ Users下的所有预订?:
还有第二个为Workers工作的应用程序可以观察/ Users节点,每个工作人员都应该能够根据timeStamp从/ Users获取预订。例如,worker1382可以阅读2018年3月16日至2018年3月24日期间/ Users的预订。
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"
}
}
}
答案 0 :(得分:2)
您可以在每个子节点下的已知路径中查询属性。因此,您可以在恐龙示例中查询dimensions/weight
,然后您可以从数据中查询617643762/TimeStampDateAndTime
。
但无法查询*/TimeStampDateAndTime
,因为这不是已知路径。
如果您需要获取所有用户的日期范围内的预订列表,则需要修改数据结构以允许该查询。例如,通过添加顶级预订列表:
"Bookings": {
"book_617643762"
Customer: "cus_CRC50bSq7rXuHv"
TimeStampDateAndTime: "1521309610"
Postcode: "E14 9DS"
}
使用此附加结构,您可以查询:
dbRef = FIRDatabase.database().reference().child("Bookings")
dbRef.queryOrdered(byChild: "TimeStampDateAndTime")
.queryStarting(atValue: "1519912278")
.queryEnding(atValue: "1520689878")
.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
print(snapshot.value) //returns null
}