Ir para o console
Teste o Cloud Firestore: conheça o banco de dados escalonável e flexível do Firebase e do Google Cloud Platform. Saiba mais sobre o Cloud Firestore.

Trabalhar com listas de dados na Web

Receber uma referência do banco de dados

Para ler ou gravar dados do banco de dados, você precisa de uma instância de firebase.database.Reference:

// Get a reference to the database service
var database = firebase.database();

Como ler e gravar listas

Anexar a uma lista de dados

Use o método push() para anexar dados a uma lista em apps de vários usuários. O método push() gera uma chave exclusiva sempre que um novo filho é adicionado a uma referência específica do Firebase. Ao usar essas chaves geradas automaticamente para cada novo elemento da lista, vários clientes podem adicionar filhos no mesmo local simultaneamente sem criar conflitos de gravação. A chave exclusiva gerada por push() é baseada em um carimbo de data/hora, portanto, os itens da lista são organizados automaticamente em ordem cronológica.

Use a referência aos novos dados retornados pelo método push() para receber o valor da chave filho que foi gerada automaticamente, ou para definir dados para o filho. Chamar .key em uma referência push() retorna o valor da chave gerada automaticamente.

Utilize essas chaves para simplificar sua estrutura de dados. Para mais informações, consulte o exemplo de distribuição de dados.

Por exemplo, push() pode ser usado para adicionar uma nova postagem à uma lista de postagens em um aplicativo social:

// Create a new post reference with an auto-generated id
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

Detectar eventos filho

Eventos filho são acionados em resposta a operações específicas que ocorrem nos filhos de um node de uma operação, como a adição de um novo filho por meio do método push() ou a atualização de um filho pelo método update().

Evento Uso normal
child_added Recuperar listas de itens ou detectar adições a uma lista de itens. Este evento é acionado uma vez para cada filho existente e sempre que um novo filho for adicionado ao caminho especificado. O listener recebe um instantâneo que contém os dados do novo filho.
child_changed Detectar mudanças em itens de uma lista. Este evento é acionado sempre que um node filho é modificado. Isso inclui modificações nos descendentes do node filho. O instantâneo transferido ao listener do evento contém os dados atualizados do filho.
child_removed Detectar itens sendo removidos de uma lista. Este evento é acionado quando um filho imediato é removido.O instantâneo transmitido para o bloco do retorno de chamada contém os dados do filho removido.
child_moved Detectar alterações na classificação dos itens em uma lista ordenada. Os eventos child_moved sempre seguem o evento child_changed que causou a alteração na ordem do item (com base no seu método atual de ordenação).

Juntos, cada um desses métodos pode ser útil para detectar alterações em um node específico de um banco de dados. Por exemplo, um app de blog em rede social pode usar esses métodos em conjunto para monitorar a atividade nos comentários de uma postagem, conforme mostrado abaixo:

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', function(data) {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', function(data) {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', function(data) {
  deleteComment(postElement, data.key);
});

Detectar eventos de valor

Detectar eventos filho é a maneira recomendada para ler listas de dados. Porém, há situações em que detectar eventos de valor em uma referência de lista é algo útil.

Anexar um observador value a uma lista de dados retornará a lista inteira de dados como um instantâneo único que você pode retornar para acessar filhos individuais.

Mesmo quando há apenas uma correspondência para a consulta, o instantâneo ainda é uma lista, mas contém somente um item. Para acessar o item, é necessário retornar o resultado:

ref.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

Este padrão pode ser útil quando você quiser buscar todos os filhos de uma lista em uma única operação, em vez de detectar eventos filhos adicionais.

Como classificar e filtrar dados

Use a classe Query do Realtime Database para recuperar dados classificados por chave, valor ou valor do filho. Também é possível filtrar o resultado classificado por um número específico de resultados ou um intervalo de chaves ou valores.

Classificar dados

Para recuperar dados classificados, comece especificando um dos métodos de ordenação para determinar como os resultados são ordenados:

Método Uso
orderByChild() Ordenar resultados pelo valor de uma chave filha específica ou caminho filho aninhado.
orderByKey() Ordenar resultados por chaves filhas.
orderByValue() Ordenar resultados por valores filhos.

Você pode usar somente um método de ordenação por vez. Chamar um método de ordenação várias vezes na mesma consulta causa um erro.

No exemplo a seguir, demonstramos como você pode recuperar uma lista das principais postagens de um usuário ordenadas pela contagem de estrelas:

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

Isso define uma consulta que, quando combinada com um listener filho, sincroniza o cliente com as postagens do usuário do caminho no banco de dados com base no código do usuário dele, ordenado pelo número de estrelas que cada postagem recebeu. Essa técnica de usar códigos como chaves de indexação é chamada de distribuição de dados e é explicada com mais detalhes em Estruturar seu banco de dados.

A chamada para o método orderByChild() especifica a chave filho pela qual ordenar os resultados. Nesse caso, as postagens são classificadas pelo valor de seus respectivos "starCount" filho. As consultas também podem ser ordenadas por filhos aninhados, caso seus dados se pareçam com estes:

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

Nesse caso, podemos ordenar nossos elementos de lista por valores aninhados na chave metrics, especificando o caminho relacionado ao filho aninhado em nossa chamada de orderByChild().

 
var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

Para mais informações sobre a ordenação de outros tipos de dados, consulte Como os dados de consulta são ordenados.

Filtrar dados

Para filtrar dados, combine um dos métodos de limite ou de intervalo com um método de ordenação ao criar uma consulta.

Método Uso
limitToFirst() Definir o número máximo de itens para retornar a partir do início da lista ordenada de resultados.
limitToLast() Definir o número máximo de itens para retornar a partir do fim da lista ordenada de resultados.
startAt() Retornar itens maiores ou iguais à chave ou ao valor especificado, dependendo do método de ordenação escolhido.
endAt() Retornar itens inferiores ou iguais à chave ou ao valor especificado, dependendo do método de ordenação escolhido.
equalTo() Retornar itens iguais à chave ou ao valor especificado, dependendo do método de ordenação escolhido.

Ao contrário dos métodos de ordenação, você pode combinar várias funções de limite ou de intervalo. Por exemplo, combine os métodos startAt() e endAt() para limitar os resultados a um intervalo especificado de valores.

Limitar o número de resultados

Use os métodos limitToFirst() e limitToLast() para definir um número máximo de filhos a serem sincronizados para determinado evento. Por exemplo, se você usar limitToFirst() para definir um limite de 100, inicialmente receberá apenas até 100 retornos de chamada child_added. Se você tiver menos de 100 itens armazenados no seu banco de dados do Firebase, um evento child_added é acionado para cada item.

Conforme os itens são alterados, você recebe eventos child_added para os itens presentes na consulta e eventos child_removed para os itens que saem da consulta para que o número total permaneça 100.

O exemplo a seguir demonstra como o exemplo do app de blog define uma consulta para recuperar uma lista das 100 postagens mais recentes de todos os usuários:

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

Esse exemplo define somente uma consulta. Para sincronizar os dados, é necessário ter um listener anexado.

Filtrar por chave ou valor

Use startAt(), endAt() e equalTo() para escolher pontos arbitrários de início, fim e equivalência para consultas. Isso pode ser útil para paginar dados ou encontrar itens com filhos que tenham um valor específico.

Como os dados de consultas são ordenados

Nesta seção, explicamos como os dados são classificados por cada um dos métodos de ordenação na classe Query.

orderByChild

Ao usar orderByChild(), os dados que contêm a chave filha especificada são ordenados desta maneira:

  1. Filhos com valor null para a chave filha especificada vêm primeiro.
  2. Filhos com um valor false para a chave filha especificada são os próximos. Se vários filhos tiverem o valor false, eles serão classificados lexicograficamente por chave.
  3. Filhos com um valor true para a chave filha especificada são os próximos. Se vários filhos tiverem um valor true, eles serão classificados lexicograficamente pela chave.
  4. Filhos com um valor numérico são os próximos, classificados em ordem crescente. Se vários filhos tiverem o mesmo valor numérico para o nó filho especificado, eles serão classificados por chave.
  5. Strings vêm depois dos números e são classificadas lexicograficamente em ordem crescente. Se vários filhos tiverem o mesmo valor para o nó filho especificado, eles serão ordenados lexicograficamente por chave.
  6. Objetos são os últimos e são classificados lexicograficamente pela chave em ordem crescente.

orderByKey

Ao usar orderByKey() para classificar seus dados, os dados são retornados em ordem ascendente pelo nome da chave.

  1. Filhos com uma chave que possa ser analisada como um número inteiro de 32 bits vêm primeiro, classificados em ordem ascendente.
  2. Filhos com um valor de string como chave são os próximos, classificados de modo lexicográfico em ordem ascendente.

orderByValue

Ao usar orderByValue(), os filhos são ordenados pelo valor deles. Os critérios de ordenação são os mesmos que os em orderByChild(), mas o valor do node é usado em vez do valor de uma chave filho especificada.

Desanexar listener

Retornos de chamada são removidos chamando o método off() na sua referência ao banco de dados do Firebase.

Você pode remover um único listener ao transmiti-lo como um parâmetro para off(). Chamar off() no local sem argumentos remove todos os listeners desse local.

Chamar off() em um listener pai não remove automaticamente os listeners registrados nos nodes filho dele. off() também precisa ser chamado nos listeners filho para remover o retorno de chamada.

Próximas etapas