Firebase警告:使用Firebase云功能搜索数据时使用未指定的索引

时间:2018-05-22 09:21:19

标签: javascript firebase firebase-realtime-database google-cloud-functions

我构建了一个Firebase云功能,用于查找“IsNotificationEnabled”值等于true的用户。 我的部分功能

$oldwildcard = "*$old*"

$items  = Get-ChildItem -path "O:\Reviews"
[array]::Reverse($items)

foreach($item in $items)
{
    if($item.name -clike $oldwildcard)
    {
        Write-Host $item.FullName -ForegroundColor green
        $newName = $item.name -creplace $old, $new 
        Rename-Item -Path $item.PSPath -NewName $newName
    }
}

正如您在此处所见,我正在寻找IsNotificationEnabled = true的用户。当我运行它时,我得到了日志

  

[2018-05-22T09:12:57.352Z] @ firebase / database:FIREBASE警告:   使用未指定的索引。您的数据将被下载和过滤   在客户端上。考虑添加“.indexOn”:“IsNotificationEnabled”at   /用户遵守安全规则以获得更好的性能。

我在firebase控制台中插入的规则

export const sendPushNotification = functions.https
.onRequest(async (req, res) => {
    try {
        const { message } = req.body;
        var usersRef = firebase.ref('/Users');
        var usersPushNotificationTokensRef = firebase.ref('/PushNotificationTokens')

        var listUsersSendNotifications = [],
            usersWithTokenSendNotifications = [],
            promises = [];
        if (message) {
            await usersRef.orderByChild('IsNotificationEnabled').equalTo(true).once('value', (snapshot) => {
                snapshot.forEach((childSnapshot) => {
                    console.log(childSnapshot.key)
                    listUsersSendNotifications.push(childSnapshot.key)

                    return false;
                })
            })
            ..........................

1 个答案:

答案 0 :(得分:1)

如消息所示,您需要将索引添加到/Users。您现在将它添加到较低的级别,在那里它无法工作。

{
  "rules": {
    "Users":{
      ".indexOn": ["IsNotificationEnabled"]
    },
    ".read": true,
    ".write": true
  }
}

通过考虑运行查询的位置,我发现最容易记住定义索引的位置。由于您的查询在/Users上运行,因此您需要在该级别上定义索引。

我还会删除.read上的.write/Users/$uid规则,因为它们无效。您已经在root上授予完全读/写访问权限,并且不能在较低级别获取权限。