您在下面看到的当前查询效率不高,因为我没有设置正确的索引。我在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?
答案 0 :(得分:5)
添加请求的索引似乎相当简单:
{
"rules": {
"users": {
".indexOn": ["kxSWLGDxpYgNQNFd3Q5WdoC9XFk2", "SjZLsTGckoc7ZsyGV3mmwc022J93", "mcOK5wVZoZYlFZZICXWYr3H81az2"]
}
}
}
您更担心的是手动添加这些索引是不可行的,因为您在代码中生成了用户ID。
不幸的是,没有API来生成索引。
相反,您需要以不同方式对数据建模,以允许您想要执行的查询。在这种情况下,您希望检索特定用户的对话。因此,您需要存储每个特定用户的对话:
conversationsByUser {
"SjZLsTGckoc7ZsyGV3mmwc022J93": {
"-KS3Y9dMLXfs3FE4nlm7": true
},
"mcOK5wVZoZYlFZZICXWYr3H81az2": {
"-KS3Y9dMLXfs3FE4nlm7": true
}
}
多次存储此数据可能起初效率低下,但在使用NoSQL数据库时这种情况很常见。并且与数据库为您自动生成索引的情况完全没有什么不同,除非您必须自己编写代码来更新索引。