下面看到的当前查询效率低下,因为我没有设置正确的索引。我在Xcode的控制台中得到了建议Consider adding ".indexOn": "users/kxSWLGDxpYgNQNFd3Q5WdoC9XFk2" at /conversations。我已经试过了。
但是,我需要在users/之后的用户id是动态的。我添加了一个链接到下面的另一个帖子,它尝试了类似的东西,但我似乎无法理解。所有的帮助都将不胜感激!
注意:上面的控制台输出用户id与下面的屏幕截图不匹配,但对于解决我认为的问题并不重要。如果我错了就纠正我。谢谢!
下面是Firebase中my的结构:
{
"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?
发布于 2016-11-01 04:06:22
添加请求的索引似乎相当简单:
{
"rules": {
"users": {
".indexOn": ["kxSWLGDxpYgNQNFd3Q5WdoC9XFk2", "SjZLsTGckoc7ZsyGV3mmwc022J93", "mcOK5wVZoZYlFZZICXWYr3H81az2"]
}
}
}更有可能的是,您担心手动添加这些索引是不可行的,因为您正在生成代码中的用户it。
不幸的是,没有API来生成索引。
相反,您需要对数据进行不同的建模,以允许您想要执行的查询。在这种情况下,您希望检索特定用户的会话。因此,您需要存储每个特定用户的会话:
conversationsByUser {
"SjZLsTGckoc7ZsyGV3mmwc022J93": {
"-KS3Y9dMLXfs3FE4nlm7": true
},
"mcOK5wVZoZYlFZZICXWYr3H81az2": {
"-KS3Y9dMLXfs3FE4nlm7": true
}
}一开始,多次存储这些数据似乎效率低下,但在使用NoSQL数据库时非常常见。这与数据库是否会自动为您生成索引并没有什么不同,只是您必须编写代码来自己更新索引。
https://stackoverflow.com/questions/40353896
复制相似问题