Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs

Realm Query Language

Nesta página

  • Query com Realm SDKs
  • Exemplos nesta página
  • Expressões
  • Queries parametrizadas
  • Formatos de queries
  • Notação de ponto
  • Tipo de nil
  • Operadores de comparação
  • Operadores lógicos
  • Operadores de strings
  • Operadores ObjectId e UUID
  • Operadores aritméticos
  • Tipo de operador
  • Operadores de dicionário
  • Operadores de datas
  • Operadores agregados
  • Operadores de collections
  • Listar comparações
  • Busca de texto completo
  • Full Text Search Tokenizer Details
  • Consultas geoespaciais
  • Queries de backlink
  • Subqueries
  • Classificar, distinguir e limitar
  • Limitações do RQL de sincronização flexível
  • Requisitos de inscrição de campos de query indexados
  • Operadores de consulta não suportados na sincronização flexível
  • Listar queries
  • Objetos incorporados ou vinculados
  • Limite de tamanho da query

RQL (RQL) é uma linguagem de query baseada em strings para restringir pesquisas ao recuperar objetos de um Realm. Os métodos específicos do SDK passam queries para o mecanismo de query do Realm , que recupera objetos correspondentes do Realm. RQL A sintaxe é baseada no NSPredicate.

As queries avaliam um predicado para cada objeto na coleção que está sendo analisado. Se o predicado resolver para true, a coleção de resultados incluirá o objeto.

Você pode usar o Realm Query Language na maioria dos SDKs do Realm com os métodos de filtro ou query do seu SDK. O Swift SDK é a exceção, pois usa a API de query NSPredicate. Alguns SDKs também oferecem suporte a APIs idiomáticas para consultar domínios em sua linguagem.

Para obter mais informações sobre métodos específicos de SDK para consulta de Realms, consulte a documentação de seu SDK:

O C++ SDK++ implementa atualmente apenas um subconjunto do RQL. Para obter exemplos de consultas do Realm no C++ SDK, consulte:

Observação

O Swift SDK não suporta a Realm Query Language

O Swift SDK não suporta queries com a Realm Query Language. Em vez disso, você pode usar o NSPredicate para fazer a query no Realm. Para obter exemplos de queries do Realm no Swift SDK, consulte Filtrar dados - Swift SDK.

Você também pode usar o Realm Query Language para procurar dados no Realm Studio. O Realm Studio é uma ferramenta visual para visualizar, editar e projetar arquivos do Realm.

Muitos dos exemplos nesta página usam um conjunto de dados simples para um aplicativo de lista de tarefas. Os dois tipos de objetos do Realm são Project e Item.

  • Uma Item tem um nome, o nome do responsável e um sinalizador finalizado. Há também um número arbitrário de prioridade (maior é mais importante) e um número de minutos gastos trabalhando nisso.

  • Um Project tem zero ou mais Items e uma cota opcional para o número mínimo de itens de tarefas esperado para ser concluído.

Consulte o esquema para estas duas classes, Project e Item, abaixo:

public class Item extends RealmObject {
ObjectId id = new ObjectId();
String name;
Boolean isComplete = false;
String assignee;
Integer priority = 0;
Integer progressMinutes = 0;
@LinkingObjects("items")
final RealmResults<Project> projects = null;
}
public class Project extends RealmObject {
ObjectId id = new ObjectId();
String name;
RealmList<Item> items;
Integer quota = null;
}
open class Item(): RealmObject() {
var id: ObjectId = new ObjectId()
@FullText
lateinit var name: String
var isComplete: Boolean = false
var assignee: String? = null
var priority: Int = 0
var progressMinutes: Int = 0
}
open class Project(): RealmObject() {
var id: ObjectId = new ObjectId()
lateinit var name: String
lateinit var items: RealmList<Item>
var quota: Int? = null
}
public class Item : RealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("name")]
[Indexed(IndexType.FullText)]
public string Name { get; set; }
[MapTo("isComplete")]
public bool IsComplete { get; set; } = false;
[MapTo("assignee")]
public string Assignee { get; set; }
[MapTo("priority")]
public int Priority { get; set; } = 0;
[MapTo("progressMinutes")]
public int ProgressMinutes { get; set; } = 0;
[MapTo("projects")]
[Backlink(nameof(Project.Items))]
public IQueryable<Project> Projects { get; }
}
public class Project : RealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("name")]
public string Name { get; set; }
[MapTo("items")]
public IList<Item> Items { get; }
[MapTo("quota")]
public int Quota { get; set; }
}
const ItemModel = {
name: "Item",
properties: {
id: "objectId",
name: {type: "string", indexed: "full-text"},
isComplete: { type: "bool", default: false },
assignee: "string?",
priority: {
type: "int",
default: 0,
},
progressMinutes: {
type: "int",
default: 0,
},
projects: {
type: "linkingObjects",
objectType: "Project",
property: "items",
},
},
primaryKey: "id",
};
const ProjectModel = {
name: "Project",
properties: {
id: "objectId",
name: "string",
items: "Item[]",
quota: "int?",
},
primaryKey: "id",
};
const ItemModel = {
name: "Item",
properties: {
id: "objectId",
name: {type: "string", indexed: "full-text"},
isComplete: { type: "bool", default: false },
assignee: "string?",
priority: {
type: "int",
default: 0,
},
progressMinutes: {
type: "int",
default: 0,
},
projects: {
type: "linkingObjects",
objectType: "Project",
property: "items",
},
},
primaryKey: "id",
};
const ProjectModel = {
name: "Project",
properties: {
id: "objectId",
name: "string",
items: "Item[]",
quota: "int?",
},
primaryKey: "id",
};
class Item(): RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
@FullText
var name: String = ""
var isComplete: Boolean = false
var assignee: String? = null
var priority: Int = 0
var progressMinutes: Int = 0
}
class Project(): RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var items: RealmList<Item> = realmListOf<Item>()
var quota: Int? = null
}
part 'models.realm.dart';
@RealmModel()
class _Project {
@MapTo("_id")
@PrimaryKey()
late ObjectId id;
late String name;
late List<_Item> items;
int? quota;
}
@RealmModel()
class _Item {
@MapTo("_id")
@PrimaryKey()
late ObjectId id;
@Indexed(RealmIndexType.fullText)
late String name;
bool isComplete = false;
String? assignee;
int priority = 0;
int progressMinutes = 0;
}

Os filtros consistem em expressões em um predicado. Uma expressão é uma das seguintes opções:

  • O nome de uma propriedade do objeto que está sendo avaliados.

  • Um operador e até duas expressões de argumento. Por exemplo, na expressão A + B, a totalidade de A + B é uma expressão, mas A e B também são expressões de argumento para o operador +.

  • Um valor, como uma string ('hello') ou um número (5).

"progressMinutes > 1 AND assignee == $0", "Ali"

Crie queries parametrizadas para interpolar variáveis em instruções preparadas do Realm Query Language. A sintaxe das variáveis interpoladas é $<int>, começando em 0. Passe os argumentos posicionais como argumentos adicionais para os métodos do Realm SDK que usam a Realm Query Language.

Inclua apenas um parâmetro com $0.

"progressMinutes > 1 AND assignee == $0", "Ali"

Inclua vários parâmetros com números inteiros ascendentes, começando em $0.

"progressMinutes > $0 AND assignee == $1", 1, "Alex"

A tabela a seguir mostra como uma query deve ser formatada quando serializada e parametrizada para os seguintes tipos de dados:

Tipo
Exemplo parametrizado
Exemplo serializado
Observação
Boolean
"setting == $0", false
"setting == false"
true ou false valores.
"name == $0", "George"
"name == 'George'"
Aplica-se ao tipo de dados string e char.
"age > $0", 5.50
" página > 5,50 "
Aplica-se aos tipos de dados int, short, long, double, Decimal128 e float.
"date < $0", dateObject
"date < 2021-02-20@17:30:15:0"

Para queries de data parametrizadas, você deve passar em um objeto de data. Para queries de data serializadas, você pode representar a data nos seguintes formatos:

  • Como uma data e hora explícitas: AAAA-MM-DD@HH:mm:ss:nn (ano-mês-dia@horas:minutos:segundos:nanossegundos)

  • Como em datetime relação à época do Unix- Ts:n (T, designa o início do tempo; s, segundos; n, nanossegundos)

  • Objeto Date parametrizado

"_id == $0", oidValue
"_id == oid(507f1f77bcf86cd799439011)"
Para queries ObjectId parametrizadas, você deve passar um ObjectId. Para queries serializadas do ObjectId, a representação de strings é oid(<ObjectId String>).
"id == $0", uuidValue
"id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)"
Para consultas UUID parametrizadas, você deve passar um UUID. Para consultas serializadas do UUID, a representação da string é uuid(<UUID String>).
Binário
"value == $0", "binary"
"value == 'binary'"
Para caracteres ASCII, o RQL serializa o valor binário como uma string, com aspas. Para caracteres não imprimíveis, o RQL serializa o binário para um valor base 64.
"ANY items.name == {$0, $1}", "milk", "bread"
"ANY items.name == {'milk', 'bread'}"
Aplica-se a listas, coleções e conjuntos. Um valor parametrizado deve ser usado para cada membro da lista.
RealmObject
"ANY items == $0", obj("Item", oid(6489f036f7bd0546377303ab)))
"ANY items == obj('Item', oid(6489f036f7bd0546377303ab))"
Para passar em um RealmObject, é necessária a classe e a chave primária do objeto.

Quando fizer referência a uma propriedade de objeto, você pode usar a notação de ponto para se referir a propriedades derivadas desse objeto. Você pode fazer referência até mesmo a propriedades de objetos embarcados e relacionamentos com a notação de pontos.

Por exemplo, considere uma query um objeto com uma propriedade workplace que se refere a um objeto de local de trabalho. O objeto do local de trabalho tem uma propriedade de objeto embarcado, address. Você pode encadear notação de ponto para se referir à propriedade de código postal desse endereço:

"workplace.address.zipcode == 10019"

O Realm Query Language inclui o tipo nil para representar um ponteiro nulo. Você pode referenciar nil diretamente em suas queries ou com uma query parametrizada. Se você estiver utilizando uma query parametrizada, cada SDK mapeará seu respectivo ponteiro nulo para nil.

"assignee == nil"
// comparison to language null pointer
"assignee == $0", null

A operação mais direta em uma pesquisa é a comparação de valores.

Importante

Os tipos devem corresponder

O tipo em ambos os lados do operador deve ser equivalente. Por exemplo, comparar um ObjectId com string provocará uma falha de pré-condição com uma mensagem como esta:

"Expected object of type object id for property 'id' on object of type
'User', but received: 11223344556677889900aabb (Invalid value)"

É possível comparar qualquer tipo numérico com qualquer outro tipo numérico, incluindo decimal, flutuante e decimal128.

Operador
Descrição
BETWEEN {number1, number2}
Avalia como true se a expressão numérica ou de data à esquerda estiver entre ou igual ao intervalo à direita. Para datas, isso é avaliado como true se a data à esquerda estiver dentro do intervalo de datas à direita.
==, =
Avalia para true se a expressão do lado esquerdo é igual à expressão do lado direito.
>
Avalia como true se a expressão numérica ou de data do lado esquerdo é maior que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior à data do lado direito.
>=
Avalia como true se a expressão numérica ou de data do lado esquerdo é maior ou igual à expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior ou igual à data do lado direito.
IN
Avalia como true se a expressão da esquerda estiver na lista da direita. Isso é equivalente e usado como uma abreviação para == ANY.
<
Avalia como true se a expressão numérica ou de data do lado esquerdo é menor que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é anterior à data do lado direito.
<=
Avalia como true se a expressão numérica à esquerda for menor ou igual à expressão numérica à direita. Com datas, avalia como true se a data do lado esquerdo é anterior ou igual à data do lado direito.
!=, <>
Avalia como true se a expressão do lado esquerdo não é igual à expressão do lado direito.

Exemplo

O exemplo a seguir usa operadores de comparação da Realm Query Language para:

  • Encontrar itens de tarefa de alta prioridade comparando o valor do valor da propriedade priority com um número limite, acima do qual a prioridade pode ser considerada alta.

  • Encontrar itens de tarefas de longa execução verificando se a propriedade progressMinutes está igual ou superior a um determinado valor.

  • Encontre itens de tarefas não atribuídos localizando itens onde a propriedade assignee é igual a null.

  • Encontrar itens de tarefas a fazer dentro de uma determinada faixa de tempo, procurando itens onde a propriedade progressMinutes está entre dois números.

  • Encontre itens de tarefas com uma certa quantidade de progressMinutes na lista fornecida.

// Find high priority to-do items by comparing the value of the ``priority``
// property value with a threshold number, above which priority can be considered high.
"priority > $0", 5
// Find long-running to-do items by seeing if the progressMinutes property is at or above a certain value.
"progressMinutes > $0", 120
// Find unassigned to-do items by finding items where the assignee property is equal to null.
"assignee == $0", null
// Find to-do items within a certain time range by finding items
// where the progressMinutes property is between two numbers.
"progressMinutes BETWEEN { $0 , $1 }", 30, 60
// Find to-do items with a certain amount of progressMinutes from the given list.
"progressMinutes IN { $0, $1, $2, $3, $4, $5 }", 10, 20, 30, 40, 50, 60

Faça predicados compostos usando operadores lógicos.

Operador
Descrição
AND
&&
Avalia para true se as expressões da esquerda e da direita forem true.
NOT
!
Nega o resultado da expressão fornecida.
OR
||
Avalia como true se qualquer uma das expressões retornar true.

Exemplo

Podemos usar os operadores lógicos da linguagem de query para encontrar todos os itens concluídos de Ali. Ou seja, encontramos todos os itens em que o valor da propriedade assignee é igual a "Ali" E o valor da propriedade isComplete é true:

"assignee == $0 AND isComplete == $1", "Ali", true

Compare valores de string usando esses operadores de string. Os curingas do tipo Regex permitem mais flexibilidade na procurar.

Observação

Você pode usar os seguintes modificadores com os operadores de string:

  • [c] para insensibilidade a maiúsculas e minúsculas.

    "name CONTAINS[c] $0", 'a'
Operador
Descrição
BEGINSWITH
Avalia para true se a expressão de string à esquerda começar com a expressão de string à direita. Isso é semelhante a contains, mas só corresponde se a expressão de cadeia de caracteres à direita for encontrada no início da expressão de cadeia de caracteres à esquerda.
CONTAINS
Avalia para true se a expressão da string da direita for encontrada em qualquer lugar na expressão da string da esquerda.
ENDSWITH
Avalia como true se a expressão de string à esquerda terminar com a expressão de string à direita. Isso é semelhante ao contains, mas só corresponde se a expressão de cadeia de caracteres à esquerda for encontrada no final da expressão de cadeia de caracteres à direita.
LIKE

Avalia como true se a expressão de string à esquerda corresponder à expressão de string curinga de string à direita. Uma expressão de string curinga é uma string que usa caracteres normais com dois caracteres curinga especiais:

  • O curinga * corresponde a zero ou mais de qualquer caractere

  • O curinga ? corresponde a qualquer caractere.

Por exemplo, a cadeia curinga "d?g" corresponde a "dog", "dig" e "cavg", mas não "ding", "dg" ou "a dog".

==, =
Avalia como true se a string esquerda for lexicograficamente igual à string direita.
!=, <>
Avalia para true se a string esquerda não for lexicograficamente igual à string direita.

Exemplo

Usamos os operadores de string do mecanismo de query para encontrar:

  • Projetos com um nome começando com a letra 'e'

  • Projetos com nomes que contêm "ou"

"name BEGINSWITH[c] $0", 'e'
"name CONTAINS $0", 'ie'

Query ObjectIds e UUIDs BSON . Esses tipos de dados são frequentemente usados como chaves primárias.

Para fazer query com ObjectIds, use uma query parametrizada. Passe o ObjectId ou UUID em que você está fazendo uma query como argumento.

"_id == $0", oidValue

Você também pode colocar uma representação de string do ObjectId que você está avaliando no oid(<ObjectId String>).

"_id == oid(6001c033600510df3bbfd864)"

Para fazer uma query com UUIDs, coloque uma representação de string do UUID que você está avaliando no uuid(<UUID String>).

"id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)"
Operador
Descrição
==, =
Avalia para true se o valor à esquerda for igual ao valor à direita.
!=, <>
Avalia para true se o valor à esquerda não for igual ao valor à direita.

Realizar aritmética básica em um lado de uma expressão RQL ao avaliar tipos de dados numéricos.

"2 * priority > 6"
// Is equivalent to
"priority >= 2 * (2 - 1) + 2"

Você também pode usar múltiplas propriedades de objeto juntas em uma operação matemática.

"progressMinutes * priority == 90"
Operador
Descrição
*
Multiplicação.
/
Divisão.
+
Adição.
-
Subtração.
()
Agrupe expressões juntas.

Verifique o tipo de propriedade utilizando o operador @type. Você só pode usar o operador de tipo com tipos e dicionários mistos.

Avalie a propriedade em relação a uma representação de string do nome do tipo de dados. Consulte a documentação do SDK sobre o mapeamento dos tipos de dados da linguagem SDK para os tipos de dados do Realm.

Operador
Descrição
@type
Verifique se o tipo de propriedade é o nome da propriedade como uma string. Use == e != para comparar a equalização.
"mixedType.@type == 'string'"
"mixedType.@type == 'bool'"

Compare os valores do dicionário usando estes operadores de dicionário.

Operador
Descrição
@values
Retorna objetos que têm o valor especificado na expressão à direita.
@keys
Retorna objetos que têm a chave especificada na expressão à direita.
@size, @count
O número de elementos em um dicionário.
Dictionary['key']
Acesse o valor em uma chave de um dicionário.
ALL | ANY | NONE <property>.@type
Verifica se o dicionário contém propriedades de determinado tipo.

Você também pode usar operadores de dicionário em combinação com operadores de comparação para filtrar objetos com base em chaves e valores de dicionário. Os exemplos a seguir mostram algumas maneiras de usar operadores de dicionário com operadores de comparação. Todos os exemplos fazem query em uma coleção de objetos Realm com uma propriedade de dicionário denominada dict.

Exemplo

Os exemplos a seguir usam vários operadores de dicionário.

// Evaluates if there is a dictionary key with the name 'foo'
"ANY dict.@keys == $0", 'foo'
// Evaluates if there is a dictionary key with key 'foo' and value 'bar
"dict['foo'] == $0", 'bar'
// Evaluates if there is greater than one key-value pair in the dictionary
"dict.@count > $0", 1
// Evaluates if dictionary has property of type 'string'
"ANY dict.@type == 'string'"
// Evaluates if all the dictionary's values are integers
"ALL dict.@type == 'bool'"
// Evaluates if dictionary does not have any values of type int
"NONE dict.@type == 'double'"
// ANY is implied.
"dict.@type == 'string'"

Faça query sobre tipos de data em um domínio.

Geralmente, você deve usar uma query parametrizada para passar um tipo de dados de data da linguagem do SDK que você está usando para uma query.

"timeCompleted < $0", someDate

Você também pode especificar datas das seguintes duas maneiras:

  • Como uma data específica (em UTC)- YYYY-MM-DD@HH:mm:ss:nnnnnnnnnn (ano-mês-dia@horas:minutos:segundos:nanossegundos), UTC. Você também pode utilizar T em vez de @ para separar a data da hora.

  • Como um tempo em segundos desde a época doUnix - Ts:n, onde T designa o início do tempo, s é o número de segundos e n é o número de nanossegundos.

A data é compatível com operadores de comparação.

Exemplo

O exemplo a seguir mostra como usar uma query parametrizada com um objeto de data:

var date = new Date("2021-02-20@17:30:15:0");
"timeCompleted > $0", date

Aplique um operador agregado a uma propriedade de coleção de um objeto de Realm. Operadores de agregação percorrem uma coleção e a reduzem para um único valor.

Operador
Descrição
@avg
Avalia conforme o valor médio de uma determinada propriedade numérica em uma coleção. Se algum valor for null, ele não será contado no resultado.
@count
Avalia o número de objetos na coleção fornecida.
@max
Avalia conforme o valor mais alto de uma determinada propriedade numérica em uma coleção. null valores são ignorados.
@min
Avalia conforme o valor mais baixo de uma determinada propriedade numérica em uma coleção. null valores são ignorados.
@sum
Avalia a soma de uma determinada propriedade numérica em uma coleção, excluindo valores null.

Exemplo

Todos esses exemplos query projetos contendo itens de tarefas que atendem a estes critérios:

  • Projetos com prioridade média do item acima de 5.

  • Projetos com um item cuja prioridade é inferior a 5.

  • Projetos com um item cuja prioridade é maior que 5.

  • Projetos com mais de 5 itens.

  • Projetos com itens de longa duração.

var priorityNum = 5;
"items.@avg.priority > $0", priorityNum
"items.@max.priority < $0", priorityNum
"items.@min.priority > $0", priorityNum
"items.@count > $0", 5
"items.@sum.progressMinutes > $0", 100

Um operador de collection permite que você realize uma query das propriedades da lista dentro de uma collection de objetos. Os operadores de collection filtram uma collection aplicando um predicado a cada elemento de uma determinada propriedade de lista do objeto. Se o predicado retornar verdadeiro, o objeto será incluído na collection de saída.

Operador
Descrição
ALL
Retorna objetos onde o predicado avalia para true para todos os objetos na coleção.
ANY, SOME
Retorna objetos onde o predicado avalia para true para quaisquer objetos na coleção.
NONE
Retorna objetos onde o predicado avalia como falso para todos os objetos na coleção.

Exemplo

Este exemplo usa operadores de coleção para encontrar projetos que contêm itens pendentes que correspondem a determinados critérios:

// Projects with no complete items.
"NONE items.isComplete == $0", true
// Projects that contain a item with priority 10
"ANY items.priority == $0", 10
// Projects that only contain completed items
"ALL items.isComplete == $0", true
// Projects with at least one item assigned to either Alex or Ali
"ANY items.assignee IN { $0 , $1 }", "Alex", "Ali"
// Projects with no items assigned to either Alex or Ali
"NONE items.assignee IN { $0 , $1 }", "Alex", "Ali"

Você pode usar operadores de comparação e operadores de coleção para filtrar com base em listas de dados.

Você pode comparar qualquer tipo de lista válida. Isso inclui:

  • coleção de Objeto de Realm, que permitem filter outros data no Realm.

    "oid(631a072f75120729dc9223d9) IN items.id"
  • definidas diretamente na query, que permitem filtrar dados estáticos. Você define listas estáticas como uma lista separada por vírgulas de valores literais entre chaves de abertura ({) e fechamento (}).

    "priority IN {0, 1, 2}"
  • objetos de lista nativos passados em uma expressão parametrizada, o que permite que você passe dados do aplicativo diretamente para suas queries.

    const ids = [
    new BSON.ObjectId("631a072f75120729dc9223d9"),
    new BSON.ObjectId("631a0737c98f89f5b81cd24d"),
    new BSON.ObjectId("631a073c833a34ade21db2b2"),
    ];
    const parameterizedQuery = realm.objects("Item").filtered("id IN $0", ids);

Se você não definir um operador de coleção, uma expressão de lista padronizará para o operador ANY.

Exemplo

Estas duas queries de lista são equivalentes:

  • age == ANY {18, 21}

  • age == {18, 21}

Ambas as queries retornam objetos com uma propriedade de idade igual a 18 ou 21. Você também pode fazer o oposto, retornando objetos somente se a idade não for igual a 18 ou 21:

  • age == NONE {18, 21}

A tabela a seguir inclui exemplos que ilustram como os operadores de coleção interagem com listas e operadores de comparação:

Expressão
Partida?
Razão
ANY {1, 2, 3} > ALL {1, 2}
true
Um valor à esquerda (3) é maior que algum valor à direita (1 e 2)
ANY {1, 2, 3} == NONE {1, 2}
true
3 não corresponde a 1 ou 2
ANY {4, 8} == ANY {5, 9, 11}
false
Nem 4 nem 8 correspondem a qualquer valor à direita (5, 9 ou 11)
ANY {1, 2, 7} <= NONE {1, 2}
true
Um valor à esquerda (7) não é menor ou igual a 1 e 2
ALL {1, 2} IN ANY {1, 2, 3}
true
Cada valor à esquerda (1 e 2) é igual a 1, 2 ou 3
ALL {3, 1, 4, 3} == NONE {1, 2}
false
1 corresponde a um valor na lista NENHUM (1 ou 2)
ALL {} in ALL {1, 2}
true
Uma lista vazia corresponde a todas as listas
NONE {1, 2, 3, 12} > ALL {5, 9, 11}
false
12 é maior que todos os valores à direita (5, 9 e 11)
NONE {4, 8} > ALL {5, 9, 11}
true
4 e 8 são menores que algum valor à direita (5, 9 ou 11)
NONE {0, 1} < NONE {1, 2}
true
0 e 1 são menores que nenhum de 1 e 2

Você pode usar o RQL para consultar propriedades que tenham uma anotação de Full Text Search (FTS). O FTS suporta pesquisas booleanas de palavras correspondentes, em vez de pesquisas por relevância. Para obter informações sobre como habilitar o FTS em uma propriedade, consulte a documentação do FTS para seu SDK:

Para consultar essas propriedades, use o predicado TEXT em sua consulta.

Você pode pesquisar palavras ou frases inteiras, ou limitar seus resultados com os seguintes caracteres:

  • Exclua os resultados de uma palavra colocando o caractere - na frente da palavra.

  • Especifique prefixos colocando o caractere * no final de um prefixo. Atualmente, a pesquisa por sufixo não é possível.

No exemplo seguinte, executamos a consulta do campo Item.name:

// Filter for items with 'write' in the name
"name TEXT $0", "write"
// Find items with 'write' but not 'tests' using '-'
"name TEXT $0", "write -tests"
// Find items starting with 'wri-' using '*'
"name TEXT $0", "wri*"

Suporte a índices de pesquisa de texto completo (FTS):

  • Os tokens são diacríticos e não fazem distinção entre maiúsculas e minúsculas.

  • Os tokens só podem conter caracteres ASCII e o suplemento Latin-1 (idiomas ocidentais). Todos os outros caracteres são considerados espaços em branco.

  • As palavras divididas por um hífen (-) são divididas em dois tokens. Por exemplo, full-text é dividido em full e text.

Você pode fazer query nos dados geoespaciais utilizando o operador geoWithin . O operador geoWithin usa o par latitude/longitude na propriedade coordinates de um objeto incorporado personalizado e uma forma geoespacial. O operador verifica se o ponto cordinates está contido dentro da forma geoespacial.

As seguintes formas geoespaciais são suportadas para query:

  • GeoCircle

  • GeoBox

  • GeoPolygon

Para fazer query de dados geoespaciais:

  1. Crie um objeto com uma propriedade contendo os dados geoespaciais incorporados.

  2. Definir a forma geoespacial para configurar o limite da query.

  3. Fazer consulta usando o operador geoWithin RQL.

Na query a seguir, verificamos se as coordenadas da propriedade location incorporada estão contidas na forma GeoCircle , smallCircle:

"location geoWithin $0", smallCircle

Para mais informações sobre definir formas e objetos geoespaciais com dados geoespaciais incorporados, consulte a documentação geoespacial para seu SDK:

Um backlink é um link de relacionamento inverso que permite pesquisar objetos que fazem referência a outro objeto. Os backlinks usam as relações to-one e to-many definidas em seus esquemas de objetos, mas revertem a direção. Cada relacionamento que você define em seu esquema tem implicitamente um backlink correspondente.

Você pode acessar backlinks em queries utilizando a sintaxe @links.<ObjectType>.<PropertyName>, onde <ObjectType> e <PropertyName> referem-se a uma propriedade específica em um tipo de objeto que referencia o tipo de objeto da query.

// Find items that belong to a project with a quota greater than 10 (@links)
"@links.Project.items.quota > 10"

Você também pode definir uma propriedade linkingObjects para incluir explicitamente o backlink em seu modelo de dados. Isso permite que você faça referência ao backlink por meio de um nome de propriedade atribuído usando a notação de ponto padrão.

// Find items that belong to a project with a quota greater than 10 (LinkingObjects)
"projects.quota > 10"

O resultado de um backlink é tratado como uma coleção e suporta operadores de coleção.

// Find items where any project that references the item has a quota greater than 0
"ANY @links.Project.items.quota > 0"
// Find items where all projects that reference the item have a quota greater than 0
"ALL @links.Project.items.quota > 0"

Você pode usar operadores agregados na coleção de backlink.

// Find items that are referenced by multiple projects
"projects.@count > 1"
// Find items that are not referenced by any project
"@links.Project.items.@count == 0"
// Find items that belong to a project where the average item has
// been worked on for at least 5 minutes
"@links.Project.items.items.@avg.progressMinutes > 10"

Você pode fazer a query na contagem de todos os relacionamentos que apontam para um objeto usando o operador @count diretamente em @links.

// Find items that are not referenced by another object of any type
"@links.@count == 0"

Iterar através das propriedades da lista com outra query utilizando a função de predicado SUBQUERY() .

As subqueries são úteis para os seguintes cenários:

  • Correspondendo a cada objeto em uma propriedade de lista em várias condições

  • Contando o número de objetos que correspondem a uma subquery

SUBQUERY() tem a seguinte estrutura:

SUBQUERY(<collection>, <variableName>, <predicate>)
  • collection: o nome da propriedade pela qual fazer a iteração

  • variableName: um nome de variável do elemento a ser usado na subquery

  • predicate: O predicado da subquery. Use a variável especificada por variableName para se referir ao elemento atualmente iterado.

Uma subquery itera através da coleção fornecida e verifica o predicado fornecido em relação a cada objeto na coleção. O predicado pode se referir ao objeto iterado atual com o nome da variável passado para SUBQUERY().

Uma expressão de subquery resolve uma lista de objetos. O Realm suporta apenas o operador agregado @count no resultado de uma subquery. Isso permite que você conte quantos objetos na coleção de entrada da subquery correspondem ao predicado.

Você pode utilizar a contagem do resultado da subquery como qualquer outro número em uma expressão válida. Especificamente, você pode comparar a contagem com o número 0 para retornar todos os objetos correspondentes.

Exemplo

O exemplo a seguir mostra dois filtros de subquery em uma collection de projetos.

// Returns projects with items that have not been completed
// by a user named Alex.
"SUBQUERY(items, $item, $item.isComplete == false AND $item.assignee == 'Alex').@count > 0"
// Returns the projects where the number of completed items is
// greater than or equal to the value of a project's `quota` property.
"SUBQUERY(items, $item, $item.isComplete == true).@count >= quota"

Classifique e limite a coleção de resultados da sua query usando operadores adicionais.

Operador
Descrição
SORT

Especifique o nome da propriedade para comparar, e se classificar por ordem crescente (ASC) ou decrescente (DESC). Se você especificar vários campos SORT, você deverá especificar a ordem de classificação para cada campo. Com vários campos de classificação, a query é classificada pelo primeiro campo e, em seguida, pelo segundo.

Por exemplo, se você SORT (priority DESC, name DESC), a query retornará classificada por prioridade e então por nome quando o valor de prioridade for o mesmo.

DISTINCT
Especifique um nome da propriedade para comparar. Remova os duplicados para essa propriedade na coleção de resultados. Se você especificar vários campos DISTINCT, a query removerá os duplicados pelo primeiro campo e, em seguida, pelo segundo. Por exemplo, se você DISTINCT (name, assignee), a query removerá somente os duplicados onde os valores de ambas as propriedades são os mesmos.
LIMIT
Limite a coleção de resultados ao número especificado.

Exemplo

Use os operadores de classificar, distinguir e limitar do mecanismo de query para encontrar itens a fazer onde o atribuído seja Ali:

  • Classificado por prioridade em ordem decrescente

  • Impondo exclusividade por nome

  • Limitando os resultados para 5 itens

"assignee == 'Ali' SORT(priority DESC) DISTINCT(name) LIMIT(5)"

Adicionar um campo de query indexado à sua aplicação pode melhorar o desempenho de queries simples em dados fortemente particionados. Por exemplo, uma aplicação onde as queries mapeiam fortemente os dados para um dispositivo, armazém ou usuário, como user_id == $0, “641374b03725038381d2e1fb”, é uma boa candidata para um campo de query indexado. No entanto, um campo de query indexado tem requisitos específicos para uso em uma inscrição de query:

  • O campo de query indexado deve ser usado em todas as inscrições de query. Não pode estar faltando na query.

  • O campo de query indexado deve usar uma comparação == ou IN com uma constante pelo menos uma vez na query de inscrição. Por exemplo, user_id == $0, "641374b03725038381d2e1fb" ou store_id IN $0, {1,2,3}.

Opcionalmente, você pode incluir uma comparação AND, desde que o campo consultável indexado seja comparado diretamente com uma constante usando == ou IN pelo menos uma vez. Por exemplo, store_id IN {1,2,3} AND region=="Northeast" ou store_id == 1 AND (active_promotions < 5 OR num_employees < 10).

As consultas inválidas do Flexible Sync em um campo indexado que pode ser consultado incluem consultas em que:

  • O campo de consulta indexado não utiliza AND com o resto da consulta. Por exemplo store_id IN {1,2,3} OR region=="Northeast" é inválido porque usa OR em vez de AND. Da mesma forma, store_id == 1 AND active_promotions < 5 OR num_employees < 10 é inválido porque o AND só se aplica ao termo ao lado, não à consulta inteira.

  • O campo de consulta indexado não é utilizado em um operador de igualdade. Por exemplo store_id > 2 AND region=="Northeast" é inválido porque utiliza apenas o operador > com o campo de consulta indexado e não tem uma comparação de igualdade.

  • A query está totalmente ausente do campo de query indexado. Por exemplo, region=="Northeast ou truepredicate são inválidos porque não contêm o campo de query indexado.

A Flexible Sync tem algumas limitações ao usar operadores RQL. Quando você escreve a assinatura de consulta que determina quais dados sincronizar, o servidor não oferece suporte a esses operadores de consulta. No entanto, você ainda pode usar toda a gama de recursos de RQL para consultar o conjunto de dados sincronizado no aplicativo cliente.

Tipo de operador
Operadores não suportados
Operadores agregados
@avg, @count, @max, @min, @sum
Sufixos de query
DISTINCT, SORT , LIMIT

Queries que não diferenciam maiúsculas de minúsculas ([c]) não podem usar índices de forma eficaz. Sendo assim, queries que não diferenciam maiúsculas de minúsculas não são recomendadas, pois podem causar problemas de desempenho.

A sincronização flexível suporta apenas @count para campos de array.

A sincronização flexível oferece suporte às listas de query usando o operador IN .

Você pode consultar uma lista de constantes para ver se ela contém o valor de um campo de consulta:

// Query a constant list for a queryable field value
"priority IN { 1, 2, 3 }"

Se um campo de query tiver um valor de array, você poderá consultar para ver se ele contém um valor constante:

// Query an array-valued queryable field for a constant value
"'comedy' IN genres"

Aviso

Não é possível comparar duas listas entre si em uma consulta de sincronização flexível. Observe que esta é uma sintaxe válida do Realm Query Language fora das consultas do Flexible Sync.

// Invalid Flexible Sync query. Do not do this!
"{'comedy', 'horror', 'suspense'} IN genres"
// Another invalid Flexible Sync query. Do not do this!
"ANY {'comedy', 'horror', 'suspense'} != ANY genres"

A Flexible Sync não oferece suporte à consulta de propriedades em objetos ou links embarcados. Por exemplo, obj1.field == "foo".

O limite de tamanho para qualquer assinatura de query em seu conjunto de assinatura é de 256 kB. Exceder esse limite resulta em um erro de LimitsExceeded.

Voltar

Modificar esquema