Ios Swift-FirebaseDatabase如何计算和迭代仅为KeyID的子项?

Ios Swift-FirebaseDatabase如何计算和迭代仅为KeyID的子项?,ios,swift,firebase,firebase-realtime-database,count,Ios,Swift,Firebase,Firebase Realtime Database,Count,我的布局是这样的 @locationRef | @---LtFirstKeyUqABC123 | |--key1:val1 | |--key2:val2 | @---LtLastKeyrUqXYZ789 | |--key1:val1 | |--key2:val2 | |---address: "123 Broadway" |---city: "Bronx"

我的布局是这样的

@locationRef
    |
    @---LtFirstKeyUqABC123
    |       |--key1:val1
    |       |--key2:val2
    |
    @---LtLastKeyrUqXYZ789
    |       |--key1:val1
    |       |--key2:val2
    |
    |---address: "123 Broadway"
    |---city: "Bronx"
    |---state: "NY"
    |---zipcode: "10025"
    |---country: "United States"
我只想对Firebase
KeyIDs
进行计数和迭代,而不想对其他数据进行计数和迭代。例如,上述
locationRef
有7个子项,但在这7个子项中只有2个是keyid(
LtFirstKeyUqABC123
LtLastKeyrUqXYZ789
),它们各自有2个子项

var startKey: String?
var totalCountOfKeyIds = 0

Database.database().reference().child("locationRef")
  .queryOrderedByKey()
  .queryLimited(toLast: 10)
  .observeSingleEvent(of: .value) { (snapshot) in

     if !snapshot.exists() {
        self.totalCountOfKeyIds = 0
        return
     }

     for childSnapshot in snapshot.children {

         let snap = childSnapshot as! DataSnapshot

         // totalCountOfKeyIds = Int(snap.childrenCount) doesn't work
         print(Int(snap.childrenCount)) // on every loop this gives me the 2 children under each keyId

         if snap.exists() {

              // loop through children
              guard let children = snap.children.allObjects.first as? DataSnapshot else { return }
              for child in snap.children.allObjects as! [DataSnapshot] {

                  if let dict = child.value as? [String: Any] {
                      // get dict values
                  }
              }
              self.startKey = children.key
         }
     }
})
完成后,
totalCountOfKeyIds
应仅等于
2
startKey
应为
LtLastKeyrUqXYZ789


如何做到这一点?

在一个节点下混合不同的实体类型是一个坏主意,原因有很多,其中一个就是您在这里遇到的。我建议重新构造您的数据模型,使其具有两个顶级列表,其中一个列表下有名称属性,另一个列表下有推送ID

也就是说,根据您当前的结构,您可以通过以下方式获得计数:

  • 不包括您不想计算的属性
  • 减去不想计算的属性数
  • 第一个是这样的:

    let excludedKeys = ["address", "city", "state", "zipcode", "country"]
    Database.database().reference().child("locationRef")
      .queryOrderedByKey()
      .queryLimited(toLast: 10)
      .observeSingleEvent(of: .value) { (snapshot) in
        self.totalCountOfKeyIds = 0
    
        for childSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
            for child in childSnapshot.children.allObjects as! [DataSnapshot] {
                if !excludedKeys.contains(child.key) {
                    self.totalCountOfKeyIds = self.totalCountOfKeyIds + 1
                }
            }
        }
    })
    

    那正是你想到的。我把地址、邮政编码等放在一个节点下,然后过滤寻找那个节点。我没有添加,因为我不确定是否还有其他方法。无论如何,谢谢你的帮助!你能给我发一个指向一些文档的链接吗?这些文档包含了在一个节点下混合数据类型不是一个好主意的所有原因。我在想你说的话,我的几个节点就是这样构造的。我遇到的任何事情都没有说过不要那样做。我希望我在看到之前就知道这一点