O Firestore no modo Datastore é compatível com o uso de filtros de intervalo e desigualdade em várias propriedades em uma única consulta. Agora é possível ter condições de intervalo e desigualdade em várias propriedades e simplificar o desenvolvimento de aplicativos delegando a implementação da lógica pós-filtragem ao Firestore no modo Datastore.
Filtros de intervalo e desigualdade em várias propriedades
A consulta a seguir retorna todos os usuários com idade maior que 35 e altura entre 60 e 70 usando filtros de intervalo de idade e altura.
GQL
SELECT * FROM /users WHERE age > 35 AND height > 60 AND height < 70;
Java
Query<Entity> query =
Query.newEntityQueryBuilder()
.setKind("users")
.setFilter(
CompositeFilter.and(
PropertyFilter.gt("age", 35), PropertyFilter.gt("height", 60), PropertyFilter.lt("height", 70)))
.build();
Considerações sobre indexação
Antes de começar a executar consultas, leia sobre consultas.
Se uma cláusula ORDER BY
não for especificada, o Firestore no modo Datastore usará qualquer índice que possa satisfazer a condição de filtro da consulta para exibir a consulta, produzindo um conjunto de resultados ordenado de acordo com a definição do índice.
Para otimizar o desempenho e o custo do Firestore nas consultas no modo Datastore, otimize a ordem das propriedades no índice. Para fazer isso, garanta que o índice seja ordenado da esquerda para a direita, de modo que a consulta seja destilada para um conjunto de dados que impede a verificação de entradas de índice externas.
Suponha que você queira pesquisar em um conjunto de funcionários e encontrar funcionários com salário maior que 100.000 e número de anos de experiência maior que 0. Com base no seu entendimento do conjunto de dados, você sabe que a restrição salarial é mais seletiva que a restrição de experiência. O índice ideal
para reduzir o número de verificações de índice é o
índice (salary [...], experience [...])
. Assim, a consulta que seria rápida e econômica pediria salary
antes de experience
e seria assim:
GQL
SELECT *
FROM /employees
WHERE salary > 100000 AND experience > 0
ORDER BY salary, experience
Java
Query<Entity> query =
Query.newEntityQueryBuilder()
.setKind("employees")
.setFilter(
CompositeFilter.and(
PropertyFilter.gt("salary", 100000), PropertyFilter.gt("experience", 0)))
.setOrderBy(OrderBy("salary"), OrderBy("experience"))
.build();
Node.js
const query = datastore
.createQuery("employees")
.filter(
and([
new PropertyFilter("salary", ">", 100000),
new PropertyFilter("experience", ">", 0),
])
)
.order("salary")
.order("experience");
Python
query = client.query(kind="employees")
query.add_filter("salary", ">", 100000)
query.add_filter("experience", ">", 0)
query.order = ["-salary", "-experience"]
Práticas recomendadas para otimizar índices
Ao otimizar os índices, observe as seguintes práticas recomendadas.
Ordenar consultas por igualdades seguidas pelo intervalo mais seletivo ou campo de desigualdade
O Firestore no modo Datastore usa as propriedades mais à esquerda de um índice composto para satisfazer as
restrições de igualdade e a restrição de intervalo e desigualdade, se houver, no primeiro campo
da consulta orderBy()
. Essas restrições podem reduzir o número de entradas de índice
que o Firestore no modo Datastore verifica. O Firestore no modo Datastore usa as propriedades restantes
do índice para satisfazer outras restrições de intervalo e desigualdade da consulta. Essas
restrições não reduzem o número de entradas de índice que o Firestore no modo Datastore verifica,
mas filtram entidades sem correspondência para que o número de entidades
retornadas aos clientes seja reduzido.
Para mais informações sobre como criar índices eficientes, consulte Estrutura e definição do índice e como otimizar os índices.
Ordenar propriedades em ordem decrescente de seletividade de restrição de consulta
Para garantir que o Firestore no modo Datastore selecione o índice ideal para sua consulta,
especifique uma cláusula orderBy()
que ordene propriedades de intervalo e desigualdade em ordem decrescente
de seletividade de restrição de consulta. A seletividade mais alta corresponde a um subconjunto menor de
entidades, enquanto a seletividade mais baixa corresponde a um subconjunto maior. Selecione propriedades de intervalo e desigualdade com maior seletividade no início da ordenação do índice do que as propriedades com baixa seletividade.
Para minimizar o número de entidades que o Firestore no modo Datastore verifica e retorna na rede, sempre organize as propriedades na ordem decrescente de seletividade de restrição de consulta. Se o conjunto de resultados não estiver na ordem necessária e for esperado que ele seja pequeno, é possível implementar a lógica do lado do cliente para reordená-lo conforme sua expectativa de ordenação.
Por exemplo, suponha que você queira pesquisar em um conjunto de funcionários para encontrar aqueles com salário superior a 100.000 e ordenar os resultados por ano de experiência do funcionário. Se você espera que apenas um pequeno número de funcionários terá um salário superior a 100.000, a maneira mais eficiente de escrever a consulta é esta:
Java
Query<Entity> query =
Query.newEntityQueryBuilder()
.setKind("employees")
.setFilter(PropertyFilter.gt("salary", 100000))
.setOrderBy(OrderBy("salary"))
.build();
QueryResults<Entity> results = datastore.run(query);
// Order results by `experience`
Node.js
const query = datastore
.createQuery("employees")
.filter(new PropertyFilter("salary", ">", 100000))
.order("salary");
const [entities] = await datastore.runQuery(query);
// Order results by `experience`
Python
query = client.query(kind="employees")
query.add_filter("salary", ">", 100000)
query.order = ["salary"]
results = query.fetch()
// Order results by `experience`
Embora adicionar uma ordenação em experience
à consulta produza o mesmo conjunto
de entidades e evite a reordenação dos resultados nos clientes, a consulta pode
ler muito mais entradas de índice irrelevantes do que a consulta anterior. Isso ocorre porque
o Firestore no modo Datastore sempre prefere um índice com propriedades de índice que correspondam à
ordem por cláusula da consulta. Se experience
forem adicionados à ordem por cláusula,
o Firestore no modo Datastore selecionará o índice (experience [...], salary [...])
para calcular os resultados da consulta. Como não há outras restrições em
experience
, o Firestore no modo Datastore lerá todas as entradas de índice da
coleção employees
antes de aplicar o filtro salary
para encontrar o conjunto de
resultados finais. Isso significa que as entradas de índice que não atendem ao filtro salary
ainda são lidas, aumentando a latência e o custo da consulta.
Preços
As consultas com filtros de intervalo e desigualdade em várias propriedades são faturadas com base nas entidades lidas e nas entradas de índice lidas.
Para informações detalhadas, consulte a página Preços.
Limitações
Além das limitações de consulta, observe as seguintes limitações antes de usar consultas com filtros de intervalo e desigualdade em várias propriedades:
- O Firestore no modo Datastore limita a 10 o número de operadores de intervalo ou desigualdade. Isso evita que as consultas se tornem muito caras para serem executadas.
A seguir
- Saiba mais sobre como otimizar suas consultas.
- Saiba mais sobre como realizar consultas simples e compostas.
- Entenda como o Firestore no modo Datastore usa índices.