web-dev-qa-db-ja.com

Firebaseルールへの ".indexOn": ".value"の追加

私は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クエリを実行する必要があるためです。

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"
            }
        }
    }
}
_

しかし、私はまだその警告を常に受け​​取っています。どうすれば修正できますか?

どうもありがとうございました!

12
Marco Cavanna

この構造にインデックスを付けて効率的なクエリを可能にするには、ユーザーごとにインデックスを追加する必要があります。

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

ユーザーを動的に追加する可能性が高いため、これは維持できません。

通常のNoSQLデータベースの場合と同様に、これはデータモデルを拡張/適応して、必要なユースケースを可能にする必要があることを意味します。ユーザーのルームを照会する代わりに、(現在のデータに加えて)各ユーザーのルームのリストを保持します。

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

これで、クエリを実行する必要なく、ユーザーのチャットルームを検索できます。

子の子に値が含まれている場合のFirebaseクエリ で、この分類の問題に関する私の回答も参照してください。

12

少し遅れる可能性があることは承知しておりますが、こちらが役立ちます。私はあなたと同じ情報を探していました、そして私の場合、それは私を助けました。

$ usersIdは任意の子キーに一致します。だからあなたはこのようなことをしなければなりません。

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

私の場合:未指定のインデックスを使用しています。パフォーマンスを向上させるために、セキュリティおよびFirebaseデータベースルールにmessages/-L2bPVX4_fL41H7lhexcに「 ".indexOn": "date"」を追加することを検討してください

L2bPVX4_fL41H7lhexc == NoSQLデータベース構造の子

解決:

"messages": {
  "$messagesId": {
    ".indexOn": "date"
  }
}
8
DawidJ