web-dev-qa-db-ja.com

"エラー": "インデックスが定義されていません。"。indexOn "を追加してください

Firebaseで次のようなデータベースを作成しました。

database structure

次に、RESTクライアントに移動して、次のクエリを発行します。

https://movielens3.firebaseio.com/movieLens/users.json?orderBy="age"&startAt=25&print=pretty

それは私にエラーを与えます:

"error": "Index not defined, add ".indexOn": "age", for path "/movieLens/users", to the rules"

だから私はルールセクションに行き、このルールを定義します:

{
    "rules": {
        "users" : {
          ".indexOn": ["age", "gender", "occupation", "zipCode"]
        },
        ".read": true,
        ".write": true
    }
}

しかし、まだ同じエラーが発生します。

24
Knows Not Much

/usersのインデックスを定義しています。ツリーのルートのすぐ下に子ノードusersがないため、これらのインデックスは空になります。

/movieLens/usersをクエリしているので、ここでインデックスを定義する必要があります。

{
    "rules": {
        "movieLens": {
            "users" : {
                ".indexOn": ["age", "gender", "occupation", "zipCode"]
            },
            ".read": true,
            ".write": true
        }
    }
}

コメントの更新:

ユーザーの年齢を文字列として保存しているため、それらを数値としてフィルタリングすることはできません。解決策は、データを修正して数値として保存することです。

しかし、当面の間、このクエリはある程度機能します。

https://movielens3.firebaseio.com/movieLens/users.json?orderBy="age"&equalTo="35"

JavaScriptの場合:

ref
  .orderByChild('age')
  .startAt('35')
  .limitToFirst(3)
  .once('value', function(s) { 
    console.log(JSON.stringify(s.val(), null, '  ')); 
  }, function(error) { 
    if(error) console.error(error); 
  })

「やや」とは、数値ではなく字句ソートを行うことです。実際のソリューションのデータを修正します。

また、データを配列として保存することにより、Firebaseのベストプラクティスを無視していることに注意してください。 REST APIですでに問題が発生していたため、print=prettyを削除しました。IhighlyJavaScript開発者向けのFirebaseプログラミングガイド を最初から最後まで読んで、そこに記載されているアドバイスに従ってください。今から数時間で、何時間もかかる問題を防ぐことができます。

26