将".indexOn":".value"添加到Firebase规则中

Mar*_*nna 7 javascript angularjs firebase firebase-security firebase-realtime-database

我正在研究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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

使用Firebase比使用以下方法检索所有聊天更简单:

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

      /* Do Some Stuff Here */

  });
Run Code Online (Sandbox Code Playgroud)

每件事都运作良好,但我在控制台收到警告:

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

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

我试图添加此规则:

{
    "rules": {
        "chat": {
            "rooms": {
                ".indexOn": ".value"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然会收到那个警告.我该如何解决?

非常感谢你!

Fra*_*len 12

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

{
    "rules": {
        "chat": {
            "rooms": {
                ".indexOn": ["users/user1", "users/user2"]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是不可维护的,因为您可能会动态添加用户.

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

"user_rooms": {
  "user1": {
    "chat1": true
  },
  "user2": {
    "chat1": true,
    "chat2": true
  }
  "user3": {
    "chat2": true
  }
Run Code Online (Sandbox Code Playgroud)

现在,您甚至无需查询即可为用户查找聊天室.

如果子项的子项包含值,请参阅我在Firebase查询中有关此分类问题的答案.

  • `.value`的索引适用于`orderByValue`查询.你的是一个`orderByChild`查询,所以它需要每个命名子项的索引. (2认同)

Daw*_*idJ 8

我知道这可能有点迟了2,但这可能会对你有所帮助.我正在寻找与你相同的信息,在我的情况下,它使我感到困惑.

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

{
"rules": {
     "chat": {
         "rooms": {
             "users": {
                 "$usersId": {
                    ".indexOn": ".value"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的情况:使用未指定的索引.考虑在messages/-L2bPVX4_fL41H7lhexc上添加'".indexOn":"date"'到您的安全和Firebase数据库规则,以获得更好的性能

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

解:

"messages": {
  "$messagesId": {
    ".indexOn": "date"
  }
}
Run Code Online (Sandbox Code Playgroud)