Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве вы создадите консольное приложение Rust для подключения к кластеру Azure DocumentDB. В этом руководстве описывается настройка среды разработки, использование крейта azure_identity из Azure SDK для Rust для аутентификации и управления документами в базе данных.
Предпосылки
подписка Azure
- Если у вас нет подписки Azure, создайте бесплатную учетную запись.
Существующий кластер Azure DocumentDB
- Если у вас нет кластера, создайте новый кластер
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье "Начало работы с Azure Cloud Shell".
Если вы предпочитаете запускать справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, подумайте о запуске Azure CLI в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, войдите в Azure CLI с помощью команды az login . Чтобы завершить процесс аутентификации, следуйте шагам, отображаемым в вашем терминале. Сведения о других параметрах входа см. в статье "Проверка подлинности в Azure с помощью Azure CLI".
Когда вас попросят, установите расширение Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в статье Использование расширений и управление ими с помощью Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Настроена проверка подлинности Microsoft Entra для кластера с ролью, предоставленной вашему идентификатору
root.- Чтобы включить проверку подлинности Microsoft Entra, ознакомьтесь с руководством по настройке.
Последняя версия Python.
Настройка консольного приложения
Затем создайте проект консольного приложения и импортируйте необходимые библиотеки для проверки подлинности в кластере.
Создание проекта Rust с помощью
cargo new.cargo new mongodb-app cd mongodb-appДобавьте крейт
azure_coreк зависимостям.cargo add azure_coreДобавьте
azure_identityпакет для аутентификации.cargo add azure_identityДобавьте класс драйвера для взаимодействия с кластером
mongodb.cargo add mongodbДля асинхронных операций также добавьте вспомогательные
tokio,futuresиserdeбиблиотеки.cargo add tokio --features full cargo add futures cargo add serde --features derive
Подключение к кластеру
Теперь используйте библиотеку Azure.Identity, чтобы получить TokenCredential для подключения к вашему кластеру. Официальный драйвер MongoDB имеет специальный интерфейс, который должен быть реализован для получения маркеров из Microsoft Entra для использования при подключении к кластеру.
Откройте main.rs файл и импортируйте необходимые крейты и модули.
use azure_core::credentials::TokenCredential; use azure_identity::DefaultAzureCredential; use futures::{FutureExt, TryStreamExt}; use mongodb::{ Client, bson::doc, options::{ AuthMechanism, ClientOptions, Credential, oidc::{self, IdpServerResponse}, }, }; use serde::{Deserialize, Serialize};Создайте основную асинхронную функцию с необходимой обработкой ошибок.
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { Ok(()) }Создайте новый экземпляр структуры
azure_identity::DefaultAzureCredential.let credential = DefaultAzureCredential::new()?;Создайте функцию обратного вызова для учетных данных, чтобы обрабатывать запросы токенов от клиента MongoDB.
let azure_identity_token_credential = Credential::builder() .mechanism(AuthMechanism::MongoDbOidc) .oidc_callback(oidc::Callback::machine(move |_| { let azure_credential = credential.clone(); async move { let access_token = azure_credential .get_token(&["https://ossrdbms-aad.database.windows.net/.default"]) .await .map_err(|e| { mongodb::error::Error::custom(format!("Azure token error: {}", e)) })?; Ok(IdpServerResponse::builder() .access_token(access_token.token.secret().to_owned()) .build()) } .boxed() })) .build() .into();Определите универсальный индикатор ресурса (URI) из кластера, используя его имя, схему и глобальную конечную точку.
let cluster_name = "<azure-documentdb-cluster-name>"; let uri = format!( "mongodb+srv://{}.global.mongocluster.cosmos.azure.com/", cluster_name );Создайте экземпляр
mongodb::ClientOptionsс помощью конфигурации в соответствии с лучшими практиками, вашего URI и функции обратного вызова для предоставления учетных данных.let mut client_options = ClientOptions::parse(uri).await?; client_options.connect_timeout = Some(std::time::Duration::from_secs(120)); client_options.tls = Some(mongodb::options::Tls::Enabled(Default::default())); client_options.retry_writes = Some(true); client_options.credential = Some(azure_identity_token_credential);Создайте новый экземпляр
mongodb::Clientс помощью созданных параметров.let client = Client::with_options(client_options)?; println!("Client created");
Выполнение распространенных операций
Наконец, используйте официальную библиотеку для выполнения общих задач с базами данных, коллекциями и документами. Здесь вы используете те же классы и методы, которые будут использоваться для взаимодействия с MongoDB или DocumentDB для управления коллекциями и элементами.
Создайте структуру Rust для представления
Productдокументов сserdeподдержкой сериализации.#[derive(Serialize, Deserialize, Debug)] struct Product { _id: String, category: String, name: String, quantity: i32, price: f64, clearance: bool, }Получите ссылку на базу данных по имени.
let database = client.database("<database-name>"); println!("Database pointer created");Получите ссылку на коллекцию.
let collection = database.collection::<Product>("<collection-name>"); println!("Collection pointer created");Создайте документ с помощью
collection.update_one, и затем обновите или вставьте его в коллекцию.let document = Product { _id: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb".to_string(), category: "gear-surf-surfboards".to_string(), name: "Yamba Surfboard".to_string(), quantity: 12, price: 850.00, clearance: false, }; let response = collection .update_one( doc! { "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }, doc! { "$set": mongodb::bson::to_document(&document)? }, ) .upsert(true) .await?; println!("Documents upserted count:\t{}", response.modified_count);Чтение определенного документа из коллекции с помощью
collection.find_oneфильтра.let document = collection .find_one(doc! { "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }) .await?; println!("Read document _id:\t{:#?}", document.unwrap()._id);Запрос нескольких документов, соответствующих фильтру, с помощью
collection.find.let filter = doc! { "category": "gear-surf-surfboards" }; let mut cursor = collection.find(filter).await?; while let Some(document) = cursor.try_next().await? { println!("Found document:\t{:#?}", document); }