javascript - 添加和 ".indexOn": ".value" into Firebase Rules

标签 javascript angularjs firebase firebase-realtime-database firebase-security

我正在研究 AngularJS 和 Firebase,我正在玩一个简单的 ChatApp,只是为了理解代码。

我的 Firebase 数据库结构是这样的:

"chat": {
    "messages": {
        "chat1": { [ list of messages ] },
        "chat2": { [ list of messages ] }
    },
    "rooms": {
        "chat1": {
            "users": {
                "user1": true,
                "user2": true
            }
        },
        "chat2": {
            "users": {
                "user2": true,
                "user3": true
            }
        }
    }
}

由于 Firebase 保护规则,我无法在用户节点中添加聊天链接,因此我必须执行 Firebase 查询来为用户检索聊天室,使用 orderByChild() 查询 App启动。

使用 Firebase 比我可以使用以下方法检索所有聊天内容简单:

var chatLink = firebase.database().ref('chat/rooms');
chatLink
  .orderByChild('users/' + userId)
  .equalTo(true)
  .once('value', function(chatSnap){

      /* Do Some Stuff Here */

  });

一切正常,但我在控制台收到警告:

FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "users/{userId}" at /chat/rooms to your security rules for better performance

在网络上搜索,我发现对于变量 orderByChild() 查询,我可以在我的 Firebase 规则中使用 .indexOn: .value

我尝试添加这条规则:

{
    "rules": {
        "chat": {
            "rooms": {
                ".indexOn": ".value"
            }
        }
    }
}

但我仍然总是收到那个警告。我该如何解决?

非常感谢!

最佳答案

要索引此结构以允许高效查询,您必须为每个用户添加一个索引:

{
    "rules": {
        "chat": {
            "rooms": {
                ".indexOn": ["users/user1", "users/user2"]
            }
        }
    }
}

这将无法维护,因为您可能会动态添加用户。

与 NoSQL 数据库一样,这意味着您必须扩展/调整您的数据模型以允许您想要的用例。不要为他们的用户查询房间,而是为每个用户保留一个房间列表(除了您当前的数据):

"user_rooms": {
  "user1": {
    "chat1": true
  },
  "user2": {
    "chat1": true,
    "chat2": true
  }
  "user3": {
    "chat2": true
  }

现在您甚至无需查询就可以查找某个用户的聊天室。

另请参阅我在 Firebase query if child of child contains a value 中关于此分类问题的回答。 .

关于javascript - 添加和 ".indexOn": ".value" into Firebase Rules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43260689/

相关文章:

javascript - 为什么每次模型更改时 Angular run controller 都会运行两次?

swift - 将大数据从 firestore 加载到 TableView Swift

javascript - 将 SVGSVGElement 转换为字符串

javascript - 我无法创建基于实际 HTML 元素的类

javascript - 如何一一获取目录下的文件链接并使用?

java - 从数据库中特定userid子节点读取值

javascript - 如何使这行代码起作用?

javascript - 使用 JavaScript 更改 SharePoint 列表的权限

javascript - Angular JS : Change only clicked button text in ng-repeat

javascript - 使用 yyyy/mm/dd 格式以 ng-repeat 显示本周数据