0

私はAngularJSとFirebaseを勉強しています。私はコードを理解するために簡単なChatAppで遊んでいます。私は必要なのためのチャットルームを取得するためにFirebaseクエリを実行するために持っているよりも、私は、ユーザノードでチャットリンクを追加することはできません原因Firebase保護ルールに".indexOn":Firebaseルールに ".value"を追加する

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

マイFirebase DB構造は次のようですユーザーは、orderByChild()というクエリをApp Start Upで使用します。ほかすべてのものの仕事

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

     /* Do Some Stuff Here */ 

    }); 

が、私は、コンソールに警告を受けています:Firebaseを使用して

は、私が使用しているすべてのチャットを検索することができるよりも簡単です

FIREBASE警告:使用します不特定のインデックス。でユーザー.indexOn: .value、私は私ができる、変数orderByChild()クエリのことを発見し、ウェブ上で検索する 『のユーザー/ {userIdを}』よりよい性能のためのあなたのセキュリティルールに部屋/チャット/時

:「.indexOn」を追加することを検討してください私のFirebaseのルール。

私はこのルールを追加しようとしました:

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

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

ありがとうございました!インデックスへ

答えて

3

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

{ 
    "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のこの分類に関する問題についての私の回答も参照してください。

+0

おかげで、しかし、 ".indexOn": ".value"のようなルールはどうですか?私は変数クエリで使用することができますが、私の場合はうまくいきません... –

+1

'.value'のインデックスは' orderByValue 'クエリ。あなたのものは' orderByChild'クエリなので、名前が付けられた各子にインデックスが必要です。 –

0

これは少し遅れている可能性がありますが、ここには役立つものがあります。私はあなたと同じ情報を探していましたが、私の場合、私はそれを癒しました。

$ usersIdはどの子キーとも一致します。だからこのようなことをしなければならない。

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

私の場合: 不特定のインデックスを使用しています。 ''を追加することを検討してください。indexOn ": "パフォーマンス向上のために、セキュリティとFirebaseデータベースルールへのメッセージ/ -L2bPVX4_fL41H7lhexcで日付"」

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

ソリューション:

"messages": { 
    "$messagesId": { 
    ".indexOn": "date" 
    } 
} 
+0

あなたの返事をありがとう!あなたのソリューションは私のデータベースのルールで動作するかもしれません! –

+0

それがあなたを助けてくれたら教えてください:) –

関連する問題