我已经开始测试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 在哪里。这可以正常工作,但唯一的问题仍然是:
user.uid
使用未指定的索引。考虑在/ babies的安全规则中添加“ .indexOn”:“ parents / S6aO6Dx4lgg6anW9S9hu7EJrhVg1”以提高性能
如何索引由用户ID呈现的“动态”子级?有办法吗?还是必须更改树结构?
谢谢。
对于这种类型的查询(通常,当您需要动态添加索引时),您可能需要设置一个反向索引。在您的情况下:
{ "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数据库)中相当普遍。