Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве вы создадите консольное приложение Rust для подключения к кластеру виртуальных ядер Azure Cosmos DB для MongoDB. В этом руководстве описывается настройка среды разработки, использование крейта из Azure SDK для Rust для проверки подлинности и управления документами в базе данных.
Предпосылки
- Существующий кластер Azure Cosmos DB для MongoDB (vCore).
Последняя версия Azure CLI в Azure Cloud Shell.
- Если вы предпочитаете локально запускать справочные команды CLI, войдите в Azure CLI с помощью
az login
команды.
- Если вы предпочитаете локально запускать справочные команды CLI, войдите в Azure CLI с помощью
Настроена проверка подлинности Microsoft Entra для кластера с ролью, предоставленной вашему идентификатору
dbOwner
.- Чтобы включить проверку подлинности Microsoft Entra, ознакомьтесь с руководством по настройке.
Последняя версия Python.
Настройка консольного приложения
Затем создайте проект консольного приложения и импортируйте необходимые библиотеки для проверки подлинности в кластере.
Создание проекта Rust с помощью
cargo new
.cargo new cosmos-mongodb-app cd cosmos-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-cosmos-db-mongodb-vcore-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); }