具有复杂DB结构的Firebase .indexOn

时间:2016-11-01 03:49:04

标签: firebase firebase-realtime-database firebase-security

您在下面看到的当前查询效率不高,因为我没有设置正确的索引。我在Xcode的控制台中得到了建议Consider adding ".indexOn": "users/kxSWLGDxpYgNQNFd3Q5WdoC9XFk2" at /conversations。我试过它,它的工作原理。

但是,我需要users/之后的用户ID是动态的。我已经添加了一个链接到下面另一篇试过类似内容的帖子,但我似乎无法得到它。非常感谢所有帮助!

注意:上面的控制台输出用户ID与下面的屏幕截图不符,但解决我认为的问题无关紧要。如果我错了,请纠正我。谢谢!

以下是Firebase中我的数据库的结构:

{
  "conversationsMessagesID" : "-KS3Y9dMLXfs3FE4nlm7",
  "date" : "2016-10-19 15:45:32 PDT",
  "dateAsDouble" : 4.6601793282986E8,
  "displayNames" : [ “Tester 1”, “Tester 2” ],
  "hideForUsers" : [ "SjZLsTGckoc7ZsyGV3mmwc022J93" ],
  "readByUsers" : [ "mcOK5wVZoZYlFZZICXWYr3H81az2", "SjZLsTGckoc7ZsyGV3mmwc022J93" ],
  "users" : {
    "SjZLsTGckoc7ZsyGV3mmwc022J93" : true,
    "mcOK5wVZoZYlFZZICXWYr3H81az2" : true
  }
}

和Swift查询:

FIRDatabase.database().reference().child("conversations")
  .queryOrderedByChild("users/\(AppState.sharedInstance.uid!)").queryEqualToValue(true)

指向其他帖子的链接: How to write .indexOn for dynamic keys in firebase?

1 个答案:

答案 0 :(得分:5)

添加请求的索引似乎相当简单:

{
  "rules": {
    "users": {
      ".indexOn": ["kxSWLGDxpYgNQNFd3Q5WdoC9XFk2", "SjZLsTGckoc7ZsyGV3mmwc022J93", "mcOK5wVZoZYlFZZICXWYr3H81az2"]
    }
  }
}

您更担心的是手动添加这些索引是不可行的,因为您在代码中生成了用户ID。

不幸的是,没有API来生成索引。

相反,您需要以不同方式对数据建模,以允许您想要执行的查询。在这种情况下,您希望检索特定用户的对话。因此,您需要存储每个特定用户的对话:

conversationsByUser {
    "SjZLsTGckoc7ZsyGV3mmwc022J93": {
        "-KS3Y9dMLXfs3FE4nlm7": true
    },
    "mcOK5wVZoZYlFZZICXWYr3H81az2": {
        "-KS3Y9dMLXfs3FE4nlm7": true
    }
}

多次存储此数据可能起初效率低下,但在使用NoSQL数据库时这种情况很常见。并且与数据库为您自动生成索引的情况完全没有什么不同,除非您必须自己编写代码来更新索引。