Firebase,Swift:仅检索那些具有特定键的“autoID”节点

Posted

技术标签:

【中文标题】Firebase,Swift:仅检索那些具有特定键的“autoID”节点【英文标题】:Firebase,Swift: Retrieving only those `autoID` node's which have a specific key 【发布时间】:2016-09-09 21:30:58 【问题描述】:

问题--->

    有没有办法检索键为autoID 的节点,该节点可能包含特定键。就像在下面的 JSON 结构中,我在一些 autoID 中有一个子节点 powers不是全部,我只想检索那些不知道其中有键 powers 的节点对应的value 可能是什么。

    在以下两种建议的方法中,哪一种会消耗更少的带宽

我的 JSON 树

node1   
  -node12  
    -autoId1  

        expo: "5122223333"
        users:   
            -MqrvHRBTRcPzrvAOdkklBzeFW7E2  
                firstName: "Margery"  
                lastName: "Lady" 
    -autoId2  
        powers: "Triple3"
        expo: "2123338983"
        users:   
            -LqrsadaDs12BTRcPzrvABzeFW7E2  
                firstName: "Tyrion"  
                lastName: "Imph"
  -node21  
    -autoId3  
        powers: "Triple"  
        expo: "5123333"
        users:   
            -MqrvHRBTRcPzrvAOdkklBzeFW7E2  
                firstName: "Cersie"  
                lastName: "Lady" 
    -autoId4  
        powers: "Quad"  
        expo: "2128983"
        users:   
            -LqrsadaDs12BTRcPzrvABzeFW7E2  
                firstName: "Sansa"  
                lastName: "Lady"  

我尝试了什么--->

检索整个node12,然后检查哪些autoId 具有特定的key。例如让我们说权力:“Triple3”

let prntRef = FIRDatabase.database().reference().child("node1").child("node12")
prntRef.observeSingleEventOfType(.Value, withBlock: (snap) in

  if snap.exists()

     for each in snap.value as! [String:AnyObject]

             prntRef.child(each.0 as! String).child("powers").observeSingleEventOfType(.Value, withBlock: (IMsnap) in

           if IMsnap.exists()

                //Found The correct node
                
            )
        
      else

         //
        
   )

我的另一个替代解决方案是:-

FIRDatabase.database().reference().child("node1").child("node12").queryOrderedByChild("powers").observeSingleEventOfType(.Value, withBlock: (snap) in

   if let snapDict = snap.value! as? [String : AnyObject]

           print(snapDict.keys.first!)   //Retrieving My AutoID .Nut this gives me entire node. 

        

        for each in snap.value as! [String:AnyObject]

             print(each.0)   //Retrieving My AutoID 

       
   )

)

注意:-我在 Firebase 论坛上发现了一些类似的 Q,但似乎没有人回答它:-https://groups.google.com/forum/#!topic/firebase-talk/ZDHKwxRMiKQ

【问题讨论】:

【参考方案1】:

如果你不关心powers的值,你只关心key是否存在于autoId节点下,你只需要.queryEqualToValue("")(这取决于key-value对的值是a字符串,对于数字,而不是 "" 只需使用 0 [取决于您的值是否大于或等于 0])。

let ref = FIRDatabase.database().referenceWithPath("node1/node12")

ref.queryOrderedByChild("powers")
ref.queryEqualToValue("")
ref.observeEventOfType(.Value, withBlock:  snap in

    print(snap) // all the autoId nodes that have the powers key
)

【讨论】:

以上是关于Firebase,Swift:仅检索那些具有特定键的“autoID”节点的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 在 Swift 中检索数据

检索存储在 childByAutoId() 参考 (Swift) 中的特定 Firebase 数据

如果键仅返回 true,如何通过连接从 Firebase 数据库中检索数据?

Firebase 实时数据库:如何在按值排序后围绕特定键检索 10 条记录?

从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段