如何在Firebase数据库中查询嵌套数据?

时间:2018-03-14 19:24:38

标签: swift firebase firebase-realtime-database

如何进行查询以获取时间戳在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"
      }
   }
}

1 个答案:

答案 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
     }