Firebase。索引上的动态密钥 [英] Firebase .indexOn dynamic keys

查看:148
本文介绍了Firebase。索引上的动态密钥的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开始测试Firebase,但是我无法弄清楚索引的一个问题。我正在根据所阅读内容创建一个结构 - Firebase Data Structuring - 就像用户和组的例子。 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(snapshot.value)

}

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


使用未指定的索引,考虑在你的安全性中添加.indexOn:
parents / S6aO6Dx4lgg6anW9S9hu7EJrhVg1
规则获得更好的性能

如何索引这个动态的孩子由用户的ID呈现?有没有办法做到这一点,或者我必须改变树的结构?

谢谢。

解决方案

查询类型(一般来说当你需要动态添加索引时),你可能需要设置一个倒排索引。在你的情况:

$ $ $
$婴儿$ {
-KQSVCXI-ZMz_lQ_Q906:{
name:Baby,
parents:{
F0o8Gr5GC2SrakUYZpC20efcmk63:true
}
},
-KQSf4t9XQC3LnbsxLYS: {
name:Name2,
parents:{
S6aO6Dx4lgg6anW9S9hu7EJrhVg1:true
}
}
},
父母:{
F0o8Gr5GC2SrakUYZpC20efcmk63:{
babies:{
-KQSVCXI-ZMz_lQ_Q906:true
}
},
S6aO6Dx4lgg6anW9S9hu7EJrhVg1:{
babies:{
-KQSf4t9XQC3LnbsxLYS:true
}
}
}
}

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


I've started testing Firebase and I can't figure out one thing about indexing. I'm creating a structure based on what I've read on - Firebase Data Structuring - something like that example with Users and Groups. JSON tree looks something like this:

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

and I'm trying to get babies for a parent - just like there were members in groups in a Firebase example. I'm doing that in the iOS Application by using:

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

                // Print value
                print(snapshot.value)

            }

where user.uid is current user's id. This works fine but the only problem that remains is this:

Using an unspecified index. Consider adding ".indexOn": "parents/S6aO6Dx4lgg6anW9S9hu7EJrhVg1" at /babies to your security rules for better performance

How to index this "dynamic" child presented by user's id? Is there a way to do it or must I change the tree structure?

Thanks.

解决方案

For this type of query (and in general when you get into requiring adding indexes dynamically) you'll likely need to set up an inverted index. In your case:

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

This type of bidirectional linking is fairly common in Firebase (and in many similar NoSQL databases).

这篇关于Firebase。索引上的动态密钥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆