Especificar uma query
Nesta página
Visão geral
Neste guia, você pode aprender como especificar uma query para corresponder a um subconjunto de documentos.
Para corresponder a um subconjunto de documentos, especifique um filtro de query contendo seus critérios de correspondência. Os critérios de correspondência consistem nos campos e valores que você deseja que os documentos correspondam. Um filtro de query contém pelo menos um conjunto de critérios de correspondência para determinar quais documento retornar. Se você usar um filtro de query vazio em uma operação de busca, o driver corresponderá a todos os documento da collection.
Em um filtro de query, você pode corresponder campos com valores literais ou com operadores de query. Os operadores de query permitem que você realize operações matemáticas ou lógicas para localizar documentos dentro de uma collection.
Para fazer a correspondência de documentos usando valores literais, use o seguinte formato:
let filter = doc! { "<field>": "<value>" };
Para criar critérios de correspondência que incluam operadores de query, use o seguinte formato:
let filter = doc! { "<field>": doc! { "<operator>": "<value>" } };
Os exemplos nas seções seguintes mostram como especificar query utilizando o método find()
para corresponder a documento em uma collection.
Este guia inclui as seguintes seções:
Dados de amostra para exemplos apresenta os dados de amostra usados pelos exemplos de consulta
Valores literais descrevem como consultar dados que correspondam exatamente a um valor fornecido no filtro de query
Comparação descreve como fazer query de dados com base em comparações com valores em uma coleção
Lógica descreve como consultar dados usando lógica aplicada aos resultados dos operadores de nível de campo
O elemento descreve como fazer query com base na presença, ausência ou tipo de campo
A avaliação descreve como executar lógica de nível superior, como pesquisas de regex e texto, ao consultar documentos em uma coleção
Bitwise descreve como fazer query com base no conjunto de bits equivalentes de um valor base10
Array descreve como fazer query de uma collection com base em dados dentro de um campo com valor de array
Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia
Dados de amostra
Os exemplos deste guia usam os seguintes documentos de amostra. Cada documento representa uma frutas no estoque de uma loja e contém informações sobre sua quantidade. Alguns documentos contêm campos que descrevem a frutas ou seus fornecedores.
struct Fruit { _id: String, name: String, quantity: i32, description: Option<String>, vendors: Option<Vec<String>> }
Os exemplos nas seções a seguir query uma collection de documento descritos por estruturas Fruit
:
let docs = vec! [ Fruit { _id: 1.to_string(), name: "orange".to_string(), quantity: 7, description: None, vendors: None }, Fruit { _id: 2.to_string(), name: "apple".to_string(), quantity: 4, description: Some("Granny Smith".to_string()), vendors: None }, Fruit { _id: 3.to_string(), name: "banana".to_string(), quantity: 36, description: None, vendors: None }, Fruit { _id: 4.to_string(), name: "pear".to_string(), quantity: 28, description: None, vendors: vec!["A".to_string(), "C".to_string() ].into() }, ];
Para saber como inserir esses dados em uma coleção, consulte o guia Inserir documentos .
Valores literais
Os filtros de query de valor literal permitem que você query dados que correspondam exatamente a um valor fornecido no filtro de query. A operação a seguir usa uma query literal para procurar documentos que contenham um campo chamado name
que tenha o valor de "pear"
:
let query = doc! { "name": "pear" }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }
Observação
As query de valores literais funcionam de forma idêntica às query que usam o operador de comparação $eq
. Por exemplo, as seguintes query são equivalentes:
my_coll.find(doc! { "price": doc! { "$eq": 5 } }).await?;
my_coll.find(doc! { "price": 5 }).await?;
Comparação
Os operadores de comparação permitem fazer query de documentos comparando-os com valores no filtro de query. Os operadores de comparação comuns incluem $gt
para comparações "maior que", $lt
para comparações "menor que" e $ne
para comparações "não igual a".
Exemplo
A operação a seguir usa o operador de comparação $gt
para fazer a correspondência de documentos com um valor quantity
maior que 5
:
// $gt means "greater than" let query = doc! { "quantity": doc! { "$gt": 5 } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None } Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None } Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }
Para obter mais informações sobre operadores de comparação, consulte Operadores de query de comparação no manual do servidor MongoDB.
Lógica
Os operadores lógicos exigem pelo menos dois critérios de correspondência e podem corresponder a documentos que atendam a alguns, todos ou nenhum desses critérios. Por exemplo, você pode usar o operador lógico $or
para fazer query de documentos que correspondem a um operador de comparação $gt
(maior que) ou a uma query de valor literal.
Exemplo
A operação a seguir usa o operador lógico $and
para fazer a correspondência de documentos com um valor quantity
maior que 10
e divisível por 3
:
let query = doc! { "$and": [ doc! { "quantity": doc! { "$gt": 10 } }, doc! { "quantity": doc! { "$mod": [ 3, 0 ] } } ] }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }
Observação
Se um filtro de consulta contiver uma consulta de valor literal com vários pares campo-valor, o driver corresponderá aos documentos que atendem a todos os critérios.
Por exemplo, as seguintes queries produzem resultados equivalentes:
my_coll.find(doc! { "price": doc! { "$eq": 5 }, "quantity": doc! { "$gt": 4 } });
my_coll.find(doc! { "$and": [ doc! { "price": { "$eq": 5 }}, doc! { "quantity": { "$gt": 4 }} ] });
Para obter uma lista completa dos operadores lógicos, consulte Operadores lógicos de query no manual do servidor.
Elemento
Os operadores de elementos permitem que você faça a correspondência de documentos com base nos tipos de campos especificados ou se eles incluem campos especificados.
Exemplo
A operação a seguir usa o operador de elemento $exists
para pesquisar documentos que contêm o campo description
:
let query = doc! { "description": doc! { "$exists": true } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "2", name: "apple", quantity: 4, description: Some("Granny Smith"), vendors: None }
Observação
A estrutura Apple que descreve os documentos neste guia usa o atributo #[serde(skip_serializing_if = "Option::is_none")]
em dois de seus campos. Este atributo especifica que o campo deve ser ignorado se seu valor for None
. Isso impede que um valor description
de None
seja retornado em uma query $exists
.
Veja o serialize_with Atributo Serde para obter mais informações.
Para obter uma lista completa dos operadores de elementos, consulte Operadores de query de elementos no manual do servidor MongoDB.
Avaliação
Os operadores de avaliação analisam campos individuais ou documentos de uma coleção para determinar se eles atendem a determinados critérios. Cada operador de avaliação executa uma função diferente. Por exemplo, o operador $mod
executa uma operação matemática em um valor de campo e o operador $where
permite avaliar valores em relação a expressões JavaScript.
Exemplo
A operação a seguir usa o operador de avaliação $mod
para procurar documentos com um valor quantity
divisível por 3:
// $mod means "modulo" and checks if the remainder is a specific value let query = doc! { "quantity": doc! { "$mod": [ 3, 0 ] } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }
Para obter uma lista completa dos operadores de avaliação, consulte Operadores de query de avaliação no manual do servidor.
Bitwise
Os operadores bit a bit convertem um campo numérico de um número de base 10 (decimal) no número de base 2 (binário) correspondente. Eles verificam se o valor em um documento tem os mesmos bits definidos como o valor em seus critérios de correspondência.
Exemplo
O exemplo a seguir corresponde a documentos em que quantity
tem os mesmos bits definidos como 7
, que é equivalente a 00000111
em binário:
let query = doc! { "quantity": doc! { "$bitsAllSet": 7 } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None }
Para obter uma lista completa de operadores bitwise, consulte Operadores de query bitwise no manual do servidor MongoDB.
Array
Os operadores de array verificam os valores ou a quantidade de elementos em um campo com valor de array.
Exemplo
O exemplo a seguir corresponde a documentos onde o campo de array vendor
contém "C"
:
let query = doc! { "vendors": doc! { "$elemMatch": { "$eq": "C" } } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }
Para obter uma lista completa de operadores bitwise, consulte Operadores de query de array no manual do servidor.
Informações adicionais
Para saber mais sobre como encontrar operações, consulte o guia Recuperar dados .
Para saber mais sobre operadores de query, consulte Seletores de query no manual do servidor MongoDB.
Documentação da API
Para saber mais sobre os métodos e tipos usados neste guia, consulte a seguinte documentação da API: