2016-01-23 4 views
15

Ho creato un database in Firebase che assomiglia a:"errore": "Indice non definito, aggiungere" .indexOn"

database structure

Ora vado in un client REST ed emettere questa query:

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

mi dà un errore:

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

Così vado nella sezione regola e definiscono questo rul e:

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

Ma ho ancora lo stesso errore.

risposta

14

Si stanno indicizzando gli indici per /users. Non esiste alcun nodo figlio users direttamente nella radice dell'albero, quindi tali indici saranno vuoti.

sei interrogazione /movieLens/users, così che è dove l'indice dovrebbe essere definito:

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

aggiornamento per il problema nei commenti:

sei memorizzare l'età dell'utente sotto forma di stringa, quindi non possiamo filtrarli come un numero. La soluzione è quella di correggere i tuoi dati e memorizzarli come un numero.

Ma nel frattempo questa query funziona un po ':

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

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

Il "abbastanza" è che lo fa una sorta lessicale, non una numerico. Correggi i dati per una soluzione reale.

Nota che stai ignorando anche le best practice di Firebase memorizzando i dati come array. Questo mi causava già problemi nell'API REST, motivo per cui ho abbandonato lo print=pretty. I altamente consiglia di leggere il Firebase programming guide for JavaScript developers dall'inizio alla fine e seguire i consigli in là. Le poche ore che impiegano ora, impediranno molte ore di problemi lungo la linea.

+1

risolve il problema ma la query 'https://movielens3.firebaseio.com/movieLens/users.json?orderBy=" age "e startAt = 25 & print = pretty' non filtra nulla. restituisce tutti i record –

+1

Stai memorizzando la tua età come una stringa. Non è una buona idea. Vorrei anche * seriamente * prendere in considerazione la creazione di indici personalizzati (solo elenchi di ricerca che si mantengono), perché si potrebbero verificare rapidamente problemi di prestazioni senza questi. Vedi questo post del blog: https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html e questo articolo: https://highlyscalable.wordpress.com/2012/03/01/ nosql-data-modellazione-tecniche / –