在 Firebase 规则中添加和 ".indexOn": ".value"

Posted

技术标签:

【中文标题】在 Firebase 规则中添加和 ".indexOn": ".value"【英文标题】:Adding and ".indexOn": ".value" into Firebase Rules 【发布时间】:2017-09-01 19:25:22 【问题描述】:

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

我的 Firebase DB 结构是这样的:

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

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

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

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

      /* Do Some Stuff Here */

  );

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

FIREBASE 警告:使用未指定的索引。考虑将 /chat/rooms 中的 ".indexOn": "users/userId" 添加到您的安全规则中以获得更好的性能

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

我已尝试添加此规则:


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

但我仍然经常收到该警告。我该如何解决?

非常感谢!

【问题讨论】:

您说您“必须添加此规则”: "rules": "chat": "rooms": ".indexOn": ".value" 但是您在哪里以及如何添加它? 【参考方案1】:

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


    "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 中对这个分类问题的回答。

【讨论】:

谢谢,但是像 ".indexOn": ".value" 这样的规则呢?我读过我可以将它与变量查询一起使用,但在我的情况下似乎不起作用...... .value 上的索引将适用于 orderByValue 查询。你的是一个orderByChild 查询,所以它需要在每个命名的孩子上都有一个索引。 如果我想用这个模型查询找到聊天室里的所有用户,难道我们还会遇到缺少“.indexOn”值的问题吗?【参考方案2】:

我知道这可能有点太晚了,但这里有一些可以帮助你的东西。我正在寻找与您相同的信息,就我而言,它帮助了我。

$usersId 匹配任何子键。所以你必须做这样的事情。


"rules": 
      "chat": 
          "rooms": 
              "users": 
                  "$usersId": 
                    ".indexOn": ".value"
                
            
        
    

我的情况:

使用未指定的索引。考虑将 ".indexOn": "date" messages/-L2bPVX4_fL41H7lhexc 添加到您的安全和 Firebase 数据库规则中以获得更好的性能:

L2bPVX4_fL41H7lhexc == child 在我的 NoSQL 数据库结构中

解决方案:

"messages": 
  "$messagesId": 
    ".indexOn": "date"
  

【讨论】:

感谢您的回复!稍后我会检查您的解决方案是否适用于我的数据库规则! 如果对你有帮助,请告诉我:) "users": "$usersId": ".indexOn": ".value" 。从不工作。为什么? 这取决于你的数据库结构你必须写什么。在我的帖子中,我写了我必须在我的数据库中添加的内容以及 OP 应该做什么。我不知道你的数据库结构是什么。 @HanWhiteking,试试 "users": ".indexOn": ".value"

以上是关于在 Firebase 规则中添加和 ".indexOn": ".value"的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - 添加数据库规则 - 路径包含无效字符

如何在没有身份验证的情况下添加 Firebase 数据库规则?

在 Firebase 中添加对另一个项目的访问权限

如何从 swift 代码中应用 firebase 数据库安全规则

如何在firebase实时数据库中编写规则?

如何使用命令行部署 Firebase 数据库安全规则?