web-dev-qa-db-fra.com

"erreur": "Index non défini, ajoutez" .indexOn "

J'ai créé une base de données dans Firebase qui ressemble à:

database structure

Maintenant, je vais dans un client REST et émets cette requête:

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

Cela me donne une erreur:

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

Je vais donc dans la section des règles et définir cette règle:

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

Mais je reçois toujours la même erreur.

24
Knows Not Much

Vous définissez des index pour /users. Il n'y a pas de nœud enfant users directement sous la racine de votre arbre, donc ces index seront vides.

Vous interrogez /movieLens/users, c'est donc là que l'index doit être défini:

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

Mise à jour pour problème dans les commentaires:

Vous stockez l'âge de l'utilisateur sous forme de chaîne, vous ne pouvez donc pas les filtrer sous forme de nombre. La solution consiste à corriger vos données et à les stocker sous forme de nombre.

Mais en attendant, cette requête fonctionne quelque peu:

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

En 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); 
  })

Le "quelque peu" étant qu'il fait une sorte lexicale, pas numérique. Corrigez les données pour une vraie solution.

Notez que vous ignorez également les meilleures pratiques Firebase en stockant les données sous forme de tableau. Cela me causait déjà des problèmes dans l'API REST, c'est pourquoi j'ai abandonné le print=pretty. Je hautement vous recommande de lire le guide de programmation Firebase pour les développeurs JavaScript du début à la fin et de suivre les conseils qui s'y trouvent. Les quelques heures qui prennent maintenant, éviteront de nombreuses heures de problèmes sur toute la ligne.

26
Frank van Puffelen