2016-08-30 92 views
3

我已经开始测试Firebase,但我无法弄清楚有关索引的一件事。我正在根据我读过的内容创建一个结构 - Firebase Data Structuring - 类似于用户和组的示例。 JSON树看起来是这样的:Firebase .indexOn动态密钥

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

,我试图让婴儿的父母 - 就像有在小组成员的火力地堡的例子。我做的是,在iOS的应用程序使用:

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

       // Print value 
       print(snapshot.value) 

      } 

其中user.uid是当前用户的ID。这工作正常,但唯一的问题仍然是这样的:

使用未指定的索引。考虑加入“.indexOn”: ‘父母/ S6aO6Dx4lgg6anW9S9hu7EJrhVg1’在/婴儿安全 规则获得更好的性能

如何指数用户的ID呈现这种‘动态’的孩子呢?有没有办法做到这一点,或者我必须改变树结构吗?

谢谢。

+0

安全规则允许带变量的动态密钥。我不确定索引是否也支持这些,但值得尝试。请参阅https://firebase.google.com/docs/database/security/user-security。规则在/ users/$ user_id上强制实施,以保护下面的任何关键字/用户。 –

回答

2

对于这种类型的查询(以及通常当您需要动态添加索引时),您可能需要设置倒排索引。你的情况:

{ 
    "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 
     } 
    } 
    } 
} 

这种类型的双向连接的是火力地堡相当普遍(在许多类似NoSQL数据库)。

+0

好的,谢谢你。但是,在这种情况下,我如何设置“.indexOn”? – jovanjovanovic

+0

由于您只在这里访问密钥,因此不需要自定义索引(密钥会自动编入索引)。如果您仍然收到关于缺少具有上述结构的索引的警告,请显示您的查询代码和您收到的警告。 –

+0

谢谢弗兰克。我仍然要测试这一点,但我相信这是使其工作的唯一正确方法。欢呼 – jovanjovanovic