2015-12-19 8 views
5

Firebase - Come si scrive più orderByChild per estrarre i dati? .Firebase - Come si scrive più orderByChild per estrarre i dati?

Sto cercando di ottenere i dati in cui 2 campi uguali quello che sto passando

Ecco un esempio del mio codice:

 this.refApp 
      .orderByChild('userUid') 
      .startAt(uid).endAt(uid) 
      .orderByChild('jobId') 
      .startAt(jobId).endAt(jobId) 
      .on('value', (snap) => {  

        //This currently doesnt get returned. 

      }); 

Nell'esempio di cui sopra non ottengo alcuna errori del compilatore e il codice sembra bene. Tuttavia, ho codificato i dati in modo tale da restituire un oggetto in cui uid e jobid sono uguali.

posso farlo funzionare per un orderByChild ma quando lo faccio due come sopra Non sembra di fare nulla.

sto usando dattiloscritto, angular2 e Firebase.

Qualche idea?

+1

Vedere http://stackoverflow.com/questions/33336697/nosql-database-design-for-queries-with-multiple-restrictions-firebase, http://stackoverflow.com/questions/27432030/how-to- do-the-following-query-in-firebase-più-di-uno-dove-condizione, http: // stackoverflow.it/questions/32538312/filter-products-on-multiple-child-properties-in-firebase –

+0

Un altro semplice scenario con cui sono bloccato è ad esempio che desidero elencare i miei contatti in base al cognome e al primo nome. Come lo fai in Firebase? –

risposta

6

È possibile utilizzare un solo metodo di ordinamento.

Per interrogare di più, è necessario ripensare la struttura dei dati. Il tuo attuale struttura probabilmente simile a questa:

{ 
    "key": { 
    "id_1": { 
     "userUid": "user_1", 
     "jobId": "job_1" 
    }, 
    "id_2": { 
     "userUid": "user_1", 
     "jobId": "job_2" 
    }, 
    "id_3": { 
     "userUid": "user_2", 
     "jobId": "job_3" 
    } 
    } 
} 

Con questa struttura si è limitato ad indice di fuori di una chiave figlio.

Ora considerare tale struttura:

{ 
    "key": { 
     "user_1": { 
     "id_1": { 
      "jobId": "job_1", 
      "userUid": "user_1" 
     }, 
     "id_2": { 
      "jobId": "job_2", 
      "userUid": "user_1" 
     } 
     } 
     "user_2": { 
     "id_3": { 
      "jobId": "job_3", 
      "userUid": "user_2" 
     } 
     } 
    } 
} 

Tale struttura crea esplicitamente un indice su uid. Così ora se si desidera ottenere tutti i lavori dall'utente è possibile scrivere questa query:

var ref = new Firebase('<my-firebase-app>'); 
var uid = 'user_1'; 
var userRef = ref.child('key').child(uid); 
var query = userRef.orderByChild('jobId'); 
query.on('value', (snap) => console.log(snap.val()); 
+0

Ciao David, capisco cosa intendi per la struttura dei dati. Non c'è davvero nessun altro modo per ottenere un oggetto dove due campi sono uguali? – AngularM

+0

Sto solo cercando di fare una dichiarazione semplice con un SQL come. – AngularM

+0

Questo non esiste nella terra di Firebase al momento. Puoi fare qualcosa come una tabella SELECT * FROM WHERE userid = "user_1", ma nessuna istruzione AND. Strutturare i tuoi dati come ho specificato ti permette di fare un po 'come l'AND. Ha senso? –

0

non è supportato.

A seconda del tipo di richiesta è necessario eseguire su un'entità, si sia necessario per memorizzare le offerte di lavoro da parte dell'utente, come @ David-est ha suggerito o aggiungere una proprietà che unisce le due proprietà:

{ 
jobId: 'J123', 
userId: 'provider:123', 
jobIdUserIdIndex: 'J123/provider:12345', 
[...] 
} 

Ma di solito, non c'è modo di permettere tutte le domande che ti servono. È necessario filtrare gli oggetti sul lato client o duplicare i dati per creare una diversa visualizzazione dei dati; i dati del lavoro verranno salvati in /jobs/$jobId, /users/$userId/jobs/$jobId e forse /pendingJobs/$jobId.

Trovo più facile da utilizzare il metodo orderBy * solo per ordinare le entità e di duplicare i dati per selezionare sottoinsiemi di loro.

Desidero che Firebase supporti gli indici che combinano più proprietà, ma per ora è necessario crearli da soli. Tuttavia, avere visualizzazioni diverse consente di applicare a loro regole di sicurezza diverse: ad es. Solo un utente dovrebbe avere accesso a /users/$userId/jobs/, solo l'amministratore dovrebbe avere accesso a /jobs/$jobId.