FirebaseデータベースのuserIdにindexOnを追加する方法

Aug 22 2020

エラーが発生します

不特定のインデックスを使用する。データがダウンロードされ、クライアントでフィルタリングされます。パフォーマンスを向上させるために、/ Productsの「.indexOn」:「WkJymEhTtvgtIzQZZxs3VUTbmLh2quan」をセキュリティルールに追加することを検討してください。

これは私のコードです:

firebase.database().ref("Products").orderByChild(user.uid + "quan").startAt(0).on('value', function (s) {
        var cartNum = 0;
        s.forEach(function (d) {
          console.log(d.child(user.uid + "quan").val());
          cartNum += d.child(user.uid + "quan").val();
        });
        $("#cartCount").text(cartNum);
      });

user.uid+ 'quan'Firebaseデータベースにある製品をクエリしようとしています

これが私のJSONの構造です---- >>>

誰かが私を助けることができればどうもありがとう

回答

1 FrankvanPuffelen Aug 22 2020 at 09:50

データのインデックス作成に関するドキュメントとエラーメッセージで説明されているように、コンソールでデータベースのFirebaseルールにインデックスを追加する必要があります。

{
  "rules": {
    "Products": {
      ".indexOn": "WkJymEhTtvgtIzQZZxs3VUTbmLh2quan"
    }
  }
}

これにより、現在のユーザーのエラーメッセージが解決されます。問題は、UIDごとにそのようなインデックスを明示的に宣言する必要があることです。これは、特定のユーザーセットを念頭に置いていない限り実行できません。

根本的な問題は、現在のデータ構造では特定の製品のユーザーを簡単に見つけることができますが、特定のユーザーの製品を簡単に見つけることはできないということです。後者のユースケースを可能にするには、その転置マッピング用にデータ構造を追加する必要があります。これは、逆インデックスまたは転置インデックスと呼ばれることもあります。

"Users": {
  "uid1": {
    "productId1": true,
    "productId2": true
  },
  "uid2": {
    "productId3": true,
    "productId4": true
  }
}

これにより一部のデータが複製されますが、関連データを両方向で検索できます。ユースケースを可能にするこのタイプのデータ重複は、NoSQLデータベースでは非常に一般的です。

参照:

  • Firebaseでの多対多の関係
  • Firebaseクエリの二重ネスト
  • 子の子に値が含まれている場合のFirebaseクエリ