如何在Firebase中查询嵌套元素?

时间:2016-05-22 10:00:25

标签: ios objective-c swift firebase

    "John" : {
      "David" : {
        "-KIMA0aPsujdAOpkzP0w" : {
          "message" : "hallu",
          "sender" : "10154053432889835",
          "time" : 1463898873196
        }
      }
    },
    "Harry" : {
      "Christina" : {
        "-KIMA0aPsujdAOpkzP0v" : {
          "message" : "hallu",
          "seen" : true,
          "sender" : "self",
          "time" : 1463898873195
        }
      },
      "Pierce" : {
        "-KILZ_GH7Ji9hQYNK-6p" : {
          "message" : "Eli there.",
          "seen" : true,
          "sender" : "179914035712208",
          "time" : 1463888795301
        },
        "-KIM8yPz2UDOZwHEg_nn" : {
          "message" : "hahjajak",
          "seen" : true,
          "sender" : "self",
          "time" : 1463898597847
        },
}

我想查询“看到”键的顶级节点值“true”的节点数 John OR Harry 里面有多个子节点每个子节点都有多个具有自动id设置的子节点。

我只是想知道“看到”键设置为 true 的对象数量,以及将“看见”键设置为 false <的对象计数/ p>

我可以按如下方式提取节点中的所有值:

ref.observeSingleEventOfType(.Value, withBlock: { snap in
    for (key,value) in snap.value as! NSDictionary {
    }

})

我可以遍历字典并手动计算对象的数量。但这不是太计算或数据效率,因为firebase是基于卷的。

我想要知道是否有任何查询来计算根节点中“被看见”键为“true”或根节点中“被看见”键为“false”的对象数。

更新

数据结构

John Harry 是用户唯一ID。 John 节点的直接子节点 David 是用户之前与之聊天的人的唯一ID。

KIMA0aPsujdAOpkzP0w 节点代表用户 John David 之间的唯一消息。

所以我想要的是计算 John <

2 个答案:

答案 0 :(得分:0)

如果您只想获得“看到”的值,您应该重新考虑数据库结构并尽可能快地进行非规范化,以尽可能快地进行阅读。

让你的结构获得“看到”的价值,每次你读到你都必须获得整个节点并循环通过它来获取值,下载不必要的数据,浪费处理时间并使整体操作变慢。

您应该创建一个新节点,并按照以后的方式存储“看到”的值。可以说,构建数据库的最佳方法是基于哪些读取操作将要执行的操作以及在这些操作中需要哪些数据。

您不必担心重复数据。请记住,Firebase具有“updateChildren”方法,允许您在单个操作中更新不同节点中的数据。

有关详细信息,请在此处阅读有关构建数据的文档:https://firebase.google.com/docs/database/android/structure-data

干杯!

答案 1 :(得分:0)

不确定这是否是有效的方法来处理它,但对于快速原型我也一直在寻找这个问题的答案。我决定使用这种策略来隔离数据结构的子节点:

   ref.observeSingleEventOfType(FIRDataEventType.Value, withBlock: { snapshot in
        for (key,value) in snapshot.value as! NSDictionary {

            if (key as! String == "John/David/etc")
            {
                let newRef  = FIRDatabase.database().reference().child("John").child(key as! String)

                newRef.observeSingleEventOfType(FIRDataEventType.Value, withBlock: { snapshot in

                    for (childKey, childValue) in snapshot.value as! NSDictionary{
                       //do whatever you want with child values/etc
                    }

                })
            }

        }

    })

请记住,我对iOS上的Firebase非常陌生,他们只是更改了文档,所以我正在努力完成它。我确信有更好的方法来完成访问子数据,但这对我的MVP起作用,所以我选择了它。

编辑:这假定您的原始引用针对您要定位的数据树部分。例如:

   let ref = FIRDatabase.database().reference().child("John")

当你执行ref.observeSingle..etc时,它会查找该子对象下面的值,而不是整个树。