Visão geral
Neste guia, você aprenderá como recuperar dados de sua collection do MongoDB usando operações de leitura. Operações de leitura são comandos que recuperam documentos do servidor.
Existem dois tipos de operações de leitura:
Encontrar operações, que permitem recuperar documento de suas collection
Operações de agregação, que permitem transformar os dados em sua collection
Este guia inclui as seguintes seções:
Dados de amostra para exemplos apresenta os dados de amostra que são usados pelos exemplos de operação de leitura
Operações de localização descreve como usar o driver para executar operações de localização
Operações de agregação descreve como usar o driver para executar operações de agregação
Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia
Dados de amostra para exemplos
Vários dos exemplos deste guia usam os seguintes documentos de amostra. Cada documento representa um item no estoque de uma loja e contém informações sobre sua categorização e preço unitário:
let docs = vec![ Inventory { item: "candle".to_string(), category: "decor".to_string(), unit_price: 2.89, }, Inventory { item: "blender".to_string(), category: "kitchen".to_string(), unit_price: 38.49, }, Inventory { item: "placemat".to_string(), category: "kitchen".to_string(), unit_price: 3.19, }, Inventory { item: "watering can".to_string(), category: "garden".to_string(), unit_price: 11.99, }, ];
Para saber como inserir esses dados em uma coleção, consulte o guia Inserir Documentos .
Encontrar operações
Use localizar operações para recuperar dados do MongoDB. As operações de localização consistem nos métodos find() e find_one() .
Encontre todos os documentos correspondentes
Para encontrar todos os documentos que correspondem aos seus critérios, use o método find() . Este método utiliza um filtro de query como parâmetro. Um filtro de query consiste nos campos e valores que formam critérios para a correspondência de documentos.
O método retorna um tipo de Cursor que você pode iterar para recuperar quaisquer documentos que correspondam aos critérios do filtro.
Para ver um exemplo que usa esse método para recuperar dados, consulte o exemplo find().
Para saber mais sobre como especificar uma query, consulte o guia Especificar uma Consulta .
Encontrar um documento
Para encontrar o primeiro documento que corresponda aos seus critérios, use o método find_one() . Este método utiliza um filtro de query como parâmetro. Um filtro de query consiste nos campos e valores que formam critérios para a correspondência de documentos.
Se um documento corresponder aos critérios de filtro, o método retornará um tipo de Result<Option<T>> com um valor de Some. Se nenhum documento corresponder aos critérios de filtro, find_one() retornará um tipo Result<Option<T>> com um valor de None.
Para ver um exemplo que usa esse método para recuperar dados, consulte o exemplo find_one().
Modificar comportamento de localização
Você pode modificar o comportamento do método find() encadeando FindOptions métodos de construtor de opção a find() e pode modificar o comportamento do método find_one() encadeando FindOneOptions métodos de construtor de opção a find_one().
A tabela a seguir descreve os campos FindOptions e FindOneOptions comumente usados que você pode definir chamando seus métodos construtores correspondentes:
Campo | Descrição |
|---|---|
| O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte o Guia de agrupamentos. |
| O índice a ser usado para a operação. Para saber mais sobre índices, consulte Índices no manual do servidor. |
| A projeção a ser usada ao retornar resultados. Para saber mais sobre projeções, consulte o guia Especificar campos para retornar. |
| O preocupação de leitura a ser usado para a operação de localização. Se você não definir esta opção, a operação herda o conjunto de preocupação de leitura para a coleção. Para saber mais sobre read concerns, consulte Read Concern no manual do Servidor. |
| |
| A classificação a ser usada ao retornar resultados. Por padrão, o driver retorna documentos em sua ordem natural ou conforme aparecem no banco de dados. Para saber mais, consulte ordem natural no glossário manual do servidor. Para saber mais sobre como usar o |
Observação
Opções de configuração
Você pode definir os campos FindOptions e FindOneOptions encadeando os métodos do construtor de opções diretamente à chamada do método da operação de localização. Se você estiver usando uma versão anterior do driver, deverá construir uma instância FindOptions ou FindOneOptions encadeando métodos de construtor de opções ao método builder() . Em seguida, passe sua instância de opções como um parâmetro para find() ou find_one().
Para obter uma lista completa de configurações que você pode especificar para cada tipo, consulte a documentação da API para FindOptions e FindOneOptions.
Exemplos de localização
As seções seguintes contêm exemplos que utilizam os métodos find() e find_one() para recuperar documentos de amostra que correspondem aos critérios de filtro.
Exemplo de encontrar()
Este exemplo executa as seguintes ações:
Chama o método
find()Passa um filtro de query para
find()que corresponde a documentos em que o valor deunit_priceé menor que12.00e o valor decategorynão é"kitchen"Encadeia o método
sort()afind()para classificar documentos correspondentes porunit_priceem ordem decrescente
let mut cursor = my_coll .find(doc! { "$and": vec! [ doc! { "unit_price": doc! { "$lt": 12.00 } }, doc! { "category": doc! { "$ne": "kitchen" } } ] }) .sort(doc! { "unit_price": -1 }) .await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); }
Inventory { item: "watering can", category: "garden", unit_price: 11.99 } Inventory { item: "candle", category: "decor", unit_price: 2.89 }
Exemplo de arquivo completo: encontrar documentos
Este exemplo recupera documentos que correspondem a um filtro de query da coleção restaurants no banco de dados sample_restaurants . O método find() retorna todos os documentos em que o valor do campo cuisine é "French".
Você pode modelar cada documento recuperado como um tipo Document ou um tipo de dados personalizado. Para especificar qual tipo de dados representa os dados da coleção, substitua o parâmetro de tipo <T> na linha realçada por um dos seguintes valores:
<Document>: Recupera e imprime documentos de coleção como documentos BSON<Restaurant>: recupera e imprime documentos de coleção como instâncias da estruturaRestaurant, definida na parte superior do código
Selecione a guia Asynchronous ou Synchronous para ver o código correspondente para cada tempo de execução:
use mongodb::{ bson::doc, Client, Collection }; use futures::TryStreamExt; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: String, } async fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri).await?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let mut cursor = my_coll.find( doc! { "cuisine": "French" } ).await?; while let Some(doc) = cursor.try_next().await? { println!("{:#?}", doc); } Ok(()) }
use mongodb::{ bson::doc, sync::{Client, Collection} }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: String, } fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri)?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let mut cursor = my_coll.find( doc! { "cuisine": "French" } ).run()?; for result in cursor { println!("{:#?}", result?); } Ok(()) }
Saída
Selecione a aba BSON Document Results ou Restaurant Struct Results para ver a saída de código correspondente com base no parâmetro de tipo da sua coleção:
... Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Cafe Un Deux Trois", ), ... }), ), Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Calliope", ), ... }), ) ...
... Restaurant { name: "Cafe Un Deux Trois", cuisine: "French", } Restaurant { name: "Calliope", cuisine: "French", } ...
Exemplo de carregar uma query de um arquivo
Você pode armazenar um filtro de queries em um arquivo JSON e carregá-lo no tempo de execução. Essa abordagem permite compartilhar definições de query entre o aplicativo Rust e ferramentas externas, como o MongoDB Shell (mongosh).
Dica
Serde JSON Dependency
Antes de carregar uma query de um arquivo, adicione a dependência serde_json executando o seguinte comando a partir da raiz do projeto :
cargo add serde_json
Primeiro, crie um arquivo JSON que contenha seu filtro de queries. O seguinte arquivo de amostra query.json contém um filtro de queries de comparação que corresponde a documentos nos quais o valor de campo category é "kitchen":
{ "category": "kitchen" }
Para carregar esse arquivo em seu aplicativo Rust, leia o arquivo usando o método std::fs::read_to_string(). Em seguida, chamar serde_json::from_str() para analisar a string JSON em uma instância do Document. Como o Document implementa a traça serde::Deserialize, você pode desserializá-lo diretamente de uma string JSON.
O exemplo a seguir lê um filtro de queries do arquivo query.json e o passa para o método find():
let json = std::fs::read_to_string("query.json") .expect("failed to read query.json"); let filter: Document = serde_json::from_str(&json) .expect("query.json contains invalid JSON"); let mut cursor = my_coll.find(filter).await?; while let Some(doc) = cursor.try_next().await? { println!("{:?}", doc); }
Inventory { item: "blender", category: "kitchen", unit_price: 38.49 } Inventory { item: "placemat", category: "kitchen", unit_price: 3.19 }
Exemplo de find_one()
Este exemplo executa as seguintes ações:
Chama o método
find_one()Passa um filtro de query para
find_one()que corresponde a documentos em que o valor deunit_priceé menor ou igual a20.00Encadeia o método
skip()parafind_one()para ignorar os dois primeiros documentos correspondentes
let result = my_coll .find_one(doc! { "unit_price": doc! { "$lte": 20.00 } }) .skip(2) .await?; println!("{:#?}", result);
Some( Inventory { item: "watering can", category: "garden", unit_price: 11.99, }, )
Exemplo de arquivo completo: encontrar um documento
Este exemplo recupera um documento que corresponde a um filtro de query da coleção restaurants no banco de dados sample_restaurants. O método find_one() retorna o primeiro documento no qual o valor do campo name é "Tompkins Square Bagels".
Você pode modelar o documento recuperado como um tipo Document ou um tipo de dados personalizado. Para especificar qual tipo de dados representa os dados da coleção, substitua o parâmetro de tipo <T> na linha realçada por um dos seguintes valores:
<Document>: Recupera e imprime documentos de coleção como documentos BSON<Restaurant>: recupera e imprime documentos de coleção como instâncias da estruturaRestaurant, definida na parte superior do código
Selecione a guia Asynchronous ou Synchronous para ver o código correspondente para cada tempo de execução:
use mongodb::{ bson::doc, Client, Collection }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: String, } async fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri).await?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let result = my_coll.find_one( doc! { "name": "Tompkins Square Bagels" } ).await?; println!("{:#?}", result); Ok(()) }
use mongodb::{ bson::doc, sync::{Client, Collection} }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: String, } fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri)?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let result = my_coll.find_one( doc! { "name": "Tompkins Square Bagels" } ).run()?; println!("{:#?}", result); Ok(()) }
Saída
Selecione a aba BSON Document Result ou Restaurant Struct Result para ver a saída de código correspondente com base no parâmetro de tipo da sua coleção:
Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Tompkins Square Bagels", ), ... }), )
Some( Restaurant { name: "Tompkins Square Bagels", cuisine: "American", }, )
Operações de agregação
Utilize operações de agregação para recuperar e transformar dados de sua collection. Você pode executar operações de agregação usando o método aggregate() .
Dados agregados do documento
O método aggregate() usa um aggregation pipeline como parâmetro. Um pipeline de agregação inclui um ou mais estágios que especificam como transformar dados. Um estágio inclui um operador de agregação (prefixado com um $) e quaisquer parâmetros exigidos para este operador.
Para saber mais sobre agregações e ver exemplos de agregação, consulte o Guia de agregação .
O método retorna os documentos resultantes em um tipo Cursor . Se o pipeline de agregação não contiver um estágio $match , o pipeline processará todos os documentos na coleção.
Modificar comportamento de agregação
Você pode modificar o comportamento do método aggregate() encadeando os métodos de construtor de opção AggregateOptions para aggregate().
A tabela a seguir descreve os campos AggregateOptions comumente usados que você pode definir chamando seus métodos construtores correspondentes:
Campo | Descrição |
|---|---|
| Permite gravar em arquivos temporários. |
| Especifica o número máximo de documentos que o servidor retorna por lote de cursor . Esta opção define o número de documentos que o cursor mantém na memória em vez do número de documentos que o cursor retorna. |
| O agrupamento a ser usado ao classificar os resultados. Para saber mais sobre agrupamentos, consulte o Guia de agrupamentos. |
| O índice a ser usado para a operação. Para saber mais sobre índices, consulte Índices no manual do servidor. |
| O preocupação de leitura a ser usado para a operação de localização. Se você não definir esta opção, a operação herda o conjunto de preocupação de leitura para a coleção. Para saber mais sobre read concerns, consulte Read Concern no manual do Servidor. |
| A preocupação de gravação para a operação. Se você não definir essa opção, a operação herdará o preocupação de gravação definido para a coleção. Para saber mais sobre write concerns, consulte Write Concern no manual do servidor. |
Para obter uma lista completa das configurações, consulte a documentação da API para AggregateOptions.
Exemplo
Este exemplo mostra como chamar o método aggregate() com um pipeline que contém os seguintes estágios:
$groupestágio para calcular a média do campounit_pricepara cada valor do campocategory$sortestágio para ordenar resultados poravg_priceem ordem crescente
let pipeline = vec![ doc! { "$group": doc! { "_id" : doc! {"category": "$category"} , "avg_price" : doc! { "$avg" : "$unit_price" } } }, doc! { "$sort": { "_id.avg_price" : 1 } }, ]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); }
Document({"_id": Document({"category": String("decor")}), "avg_price": Double(2.890000104904175)}) Document({"_id": Document({"category": String("kitchen")}), "avg_price": Double(20.840000867843628)}) Document({"_id": Document({"category": String("garden")}), "avg_price": Double(11.989999771118164)})
Informações adicionais
Para obter exemplos executáveis das operações de localização, consulte os seguintes exemplos de uso:
Para saber mais sobre as operações neste guia, consulte a seguinte documentação:
Guia de agregação
Sort guide
Skip guide
Limit guide
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: