一尘不染

Firebase .index在动态键上

swift

我已经开始测试Firebase,但我想不出关于索引的一件事。我正在根据所读内容(Firebase数据结构)创建一个结构,类似于带有用户和组的示例。JSON树如下所示:

{
  "babies" : {
    "-KQSVCXI-ZMz_lQ_Q906" : {
      "name" : "Baby",
      "parents" : {
        "F0o8Gr5GC2SrakUYZpC20efcmk63" : true
      }
    },
    "-KQSf4t9XQC3LnbsxLYS" : {
      "name" : "Name2",
      "parents" : {
        "S6aO6Dx4lgg6anW9S9hu7EJrhVg1" : true
      }
    }
  }
}

而且我正在努力为父母生小孩-就像Firebase示例中的组中的成员一样。我正在使用以下方法在iOS应用程序中执行此操作:

self.babiesReference
                .queryOrderedByChild("parents/\(user.uid)")
                .queryEqualToValue(true)
                .observeSingleEventOfType(.Value, withBlock: { (snapshot) in

                // Print value
                print(snapshot.value)

            }

user.uid当前用户的ID 在哪里。这可以正常工作,但唯一的问题仍然是:

使用未指定的索引。考虑在/ babies的安全规则中添加“ .indexOn”:“ parents /
S6aO6Dx4lgg6anW9S9hu7EJrhVg1”以提高性能

如何索引由用户ID呈现的“动态”子级?有办法吗?还是必须更改树结构?

谢谢。


阅读 341

收藏
2020-07-07

共1个答案

一尘不染

对于这种类型的查询(通常,当您需要动态添加索引时),您可能需要设置一个反向索引。在您的情况下:

{
  "babies" : {
    "-KQSVCXI-ZMz_lQ_Q906" : {
      "name" : "Baby",
      "parents" : {
        "F0o8Gr5GC2SrakUYZpC20efcmk63" : true
      }
    },
    "-KQSf4t9XQC3LnbsxLYS" : {
      "name" : "Name2",
      "parents" : {
        "S6aO6Dx4lgg6anW9S9hu7EJrhVg1" : true
      }
    }
  },
  "parents": {
    "F0o8Gr5GC2SrakUYZpC20efcmk63": {
      "babies": {
        "-KQSVCXI-ZMz_lQ_Q906": true
      }
    },
    "S6aO6Dx4lgg6anW9S9hu7EJrhVg1": {
      "babies": {
        "-KQSf4t9XQC3LnbsxLYS": true
      }
    }
  }
}

这种双向链接在Firebase(以及许多类似的NoSQL数据库)中相当普遍。

2020-07-07