Создание учетной записи, базы данных и коллекции с помощью Azure Cosmos DB для MongoDB
Azure Cosmos DB — это полностью управляемая платформа как услуга (PaaS). Чтобы использовать эту службу, необходимо сначала создать учетную запись Azure Cosmos DB в рамках нашей подписки. После создания учетной записи в нее можно добавить базу данных, коллекции и документы.
Мы рассмотрим несколько способов создания различных элементов модели Azure Cosmos DB для MongoDB.
Создайте учетную запись, базу данных и контейнер в Azure Cosmos DB для MongoDB, используя портал Azure.
Одним из способов создания учетной записи Azure Cosmos DB и ее элементов является использование портала Azure. В этом примере мы используем портал Azure для создания учетной записи Azure Cosmos DB с помощью Azure Cosmos DB для MongoDB. Затем мы добавим базу данных и коллекцию. На данный момент не беспокойтесь о заполнении более сложных параметров, которые мы подробно рассмотрим в последующих модулях. В этом примере можно просто просмотреть вкладку "Основные сведения". Создадим учетную запись и ее элементы.
Создание учетной записи для Azure Cosmos DB для MongoDB
В портал Azure нажмите кнопку "+ Создать ресурс", выберите Azure Cosmos DB и создайте его.
Выберите Azure Cosmos DB для MongoDB.
Введите следующие параметры.
- Подписка. Ваша текущая подписка Azure.
- Группа ресурсов. Новая или существующая группа ресурсов Azure для создания учетной записи Azure Cosmos DB.
- Имя учетной записи. Уникальное имя учетной записи Azure Cosmos DB. Это имя должно быть уникальным в Azure. URI учетной записи mongo.cosmos.azure.com добавлен к имени учетной записи.
- Расположение — географическое расположение, в котором размещена учетная запись Azure Cosmos DB. Обычно следует выбрать расположение рядом с пользователями или приложениями.
- Режим емкости. Как мы обсуждали в предыдущем уроке, вы можете выбрать для своей учетной записи использование подготовленной пропускной способности или бессерверного режима. Для этого примера выберите подготовленную пропускную способность.
- Применить скидку бесплатного уровня - для этого примера выберите Не применять.
- Ограничение общей пропускной способности учетной записи. Для этого примера оставьте этот флажок не отмеченным.
- Версия. Выберите 4.0.
Примечание.
Чтобы воспользоваться преимуществами поддерживаемых функций, рекомендуется по возможности использовать версию не ниже 3.6.
Выберите Просмотр и создание, а затем, в случае успешной проверки, нажмите кнопку Создать.
Примечание.
Создание учетной записи Azure Cosmos DB может занять несколько минут.
Создание базы данных и контейнера для Azure Cosmos DB для MongoDB
Процесс создания базы данных и контейнера на портале Azure является очень простым. Сначала создадим базу данных.
В меню слева от аккаунта Azure Cosmos DB для MongoDB выберите обозреватель данных.
Нажмите раскрывающийся список справа от значка Новая коллекция и выберите Создать базу данных.
Задайте базе данных новое имя в текстовом поле Идентификатор базы данных.
Хотя мы могли бы определить подготовленную пропускную способность в диалоговом окне создания базы данных, в большинстве случаев подготовленная пропускная способность выбирается на уровне контейнера. В этом примере снимите флажок Обеспечение пропускной способности и выберите ОК.
Теперь новая база данных должна появиться в разделе API MONGO. Теперь создадим новую коллекцию.
Нажмите значок создания коллекции.
Введите следующие параметры в диалоговом окне создания коллекции.
- Имя базы данных — вы заметите, что здесь есть два варианта, создать новую или использовать существующие. Этот параметр позволяет создать новую базу данных во время создания новой коллекции. Так как мы уже создали базу данных на предыдущих шагах, выберите Использовать существующую и выберите имя базы данных в раскрывающемся списке.
- Идентификатор коллекции— это имя, присвоенное коллекции.
-
Сегментирование. Обычно здесь нужно выбрать Сегментированная. Этот параметр позволяет Azure Cosmos DB создавать контейнеры, сегментированные по нескольким клиентам на основе ключа сегментирования. При использовании больших контейнеров Azure Cosmos DB распределяет арендаторов по нескольким физическим узлам для достижения высокой степени масштабирования. Мы подробно обсудим сегментирование в модуле конструктора. Выберите Сегментированная.
- Ключ партиционирования - Выбор партиционированного требует добавления ключа партиционирования. Этот ключ — это ключ раздела, определяющий стратегию разделения. Например, в коллекции IoT (Интернет вещей) это может быть /deviceid или может быть /region в зависимости от выбранной стратегии секционирования. Мы подробно обсудим стратегию секционирования в модуле конструктора.
- Флажок "Назначьте выделенную пропускную способность для этой коллекции" - Обычно требуется назначить пропускную способность вашей коллекции либо как автомасштабирование, либо вручную. Этот параметр позволяет лучше контролировать затраты на отдельную коллекцию. Мы подробно обсудим пропускную способность в модуле конструктора. Сейчас установите флажок и выберите Автомасштабирование.
- Пропускная способность коллекции или максимальное количество единиц запросов в секунду. В зависимости от того, нужно ли выбрать ручное или автомасштабирование , необходимо ввести пропускную способность коллекции или максимальное количество единиц запросов в секунду или, другими словами, режим пропускной способности. Основное различие в том, что в ручном режиме взимается плата в размере выбранного вами RU/s, независимо от того, используете ли вы его или нет. Автомасштабирование взимает только то, что вы используете до выбранного параметра Max RU/s. В любом случае, когда пропускная способность коллекции достигает выбранного значения, начинается её ограничение. Для этого примера оставьте предопределенное значение.
- Аналитическое хранилище. Обсуждение аналитического хранилища Azure Cosmos DB выходит за рамки этих уроков. Дополнительные сведения по этой теме см. в статье Что такое аналитическое хранилище Azure Cosmos DB.
- Advanced/Indexing - Мы более подробно обсуждаем индексы в модуле Design. Оставьте флажок установленным.
Теперь у нас должна быть база данных и одна коллекция для подключения. В следующем уроке мы подробно рассмотрим подключение к учетной записи Azure Cosmos DB для MongoDB. Прежде чем приступить, давайте рассмотрим альтернативный способ создания баз данных и коллекций в Azure Cosmos DB для MongoDB.
Создание или подключение к базе данных и коллекции в Azure Cosmos DB для MongoDB
Вы должны иметь возможность создавать или подключаться к учетной записи Azure Cosmos DB для MongoDB с помощью Java, Python, Node.js, .NET или другого языка программирования с драйвером MongoDB. Давайте познакомимся с некоторыми функциями, которые можно использовать для создания этих элементов с помощью различных языков. В начале этого модуля мы заявили, что разработчики могут продолжать использовать драйверы MongoDB, пакеты SDK и средства, с которыми они знакомы для подключения к Azure Cosmos DB и создания приложений. Мы используем эти драйверы и их свойства и методы для программирования доступа и операций с нашей учетной записью Azure Cosmos DB для MongoDB.
Создание или подключение к базе данных для Azure Cosmos DB для MongoDB
Вы можете использовать избранное средство разработки для создания приложения Azure Cosmos DB для MongoDB. Мы используем драйвер MongoDB для каждого соответствующего языка программирования для создания баз данных и коллекций. Давайте рассмотрим код, чтобы подключиться к учетным записям Azure Cosmos DB для MongoDB и подключиться к базе данных продуктов .
Node.js
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { MongoClient, ObjectId } = require('mongodb');
import axios from "axios";
async function main() {
// Environment variables
const endpoint = process.env.AZURE_COSMOS_RESOURCEENDPOINT;
const listConnectionStringUrl = process.env.AZURE_COSMOS_LISTCONNECTIONSTRINGURL;
const scope = process.env.AZURE_COSMOS_SCOPE;
// Uncomment the corresponding lines for the authentication type you want to use.
// For system-assigned managed identity.
// const credential = new DefaultAzureCredential();
// For user-assigned managed identity.
// const clientId = process.env.AZURE_COSMOS_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// For service principal.
// const tenantId = process.env.AZURE_COSMOS_TENANTID;
// const clientId = process.env.AZURE_COSMOS_CLIENTID;
// const clientSecret = process.env.AZURE_COSMOS_CLIENTSECRET;
// const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Acquire the access token
const accessToken = await credential.getToken(scope);
// Get the connection string
const config = {
method: 'post',
url: listConnectionStringUrl,
headers: {
'Authorization': 'Bearer ${accessToken.token}'
}
};
const response = await axios(config);
const keysDict = response.data;
const connectionString = keysDict['connectionStrings'][0]['connectionString'];
// Connect to Azure Cosmos DB for MongoDB
const client = new MongoClient(connectionString);
try {
// Open the connection
await client.connect();
// Connect to the database "products"
const ProductDatabase = client.db('products');
// Add code to connect to a collection and add an entry here
} catch (err) {
console.error("An error occurred:", err);
} finally {
// Close the connection
await client.close();
}
}
main().catch((err) => console.error("Unhandled error:", err));
Java
package com.fabrikam;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import javax.net.ssl.*;
import java.net.InetSocketAddress;
import com.azure.identity.*;
import com.azure.core.credential.*;
import java.net.http.*;
import java.net.URI;
public class App {
public static void main(String[] args) {
// Environment variables
String endpoint = System.getenv("AZURE_COSMOS_RESOURCEENDPOINT");
String listConnectionStringUrl = System.getenv("AZURE_COSMOS_LISTCONNECTIONSTRINGURL");
String scope = System.getenv("AZURE_COSMOS_SCOPE");
// Uncomment the corresponding lines for the authentication type you want to use.
// For system-assigned managed identity.
// DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
// For user-assigned managed identity.
// DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
// .managedIdentityClientId(System.getenv("AZURE_COSMOS_CLIENTID"))
// .build();
// For service principal.
// ClientSecretCredential defaultCredential = new ClientSecretCredentialBuilder()
// .clientId(System.getenv("AZURE_COSMOS_CLIENTID"))
// .clientSecret(System.getenv("AZURE_COSMOS_CLIENTSECRET"))
// .tenantId(System.getenv("AZURE_COSMOS_TENANTID"))
// .build();
MongoClient mongoClient = null;
try {
// Acquire the access token
AccessToken accessToken = defaultCredential
.getToken(new TokenRequestContext().addScopes(scope))
.block();
String token = accessToken.getToken();
// Retrieve the connection string
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(listConnectionStringUrl))
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
JSONParser parser = new JSONParser();
JSONObject responseBody = parser.parse(response.body());
List<Map<String, String>> connectionStrings = responseBody.get("connectionStrings");
String connectionString = connectionStrings.get(0).get("connectionString");
// Connect to Azure Cosmos DB for MongoDB
MongoClientURI uri = new MongoClientURI(connectionString);
mongoClient = new MongoClient(uri);
// Connect to the database
MongoDatabase ProductDatabase = mongoClient.getDatabase("products");
// Add code to connect to a collection and add an entry here
} catch (Exception e) {
e.printStackTrace();
} finally {
if (mongoClient != null) {
mongoClient.close();
}
}
}
}
Python
import os
import pymongo
import requests
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
# Environment variables
endpoint = os.getenv('AZURE_COSMOS_RESOURCEENDPOINT')
listConnectionStringUrl = os.getenv('AZURE_COSMOS_LISTCONNECTIONSTRINGURL')
scope = os.getenv('AZURE_COSMOS_SCOPE')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity
# cred = ManagedIdentityCredential()
# For user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_COSMOS_TENANTID')
# client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# client_secret = os.getenv('AZURE_COSMOS_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Get the connection string
session = requests.Session()
token = cred.get_token(scope)
response = session.post(listConnectionStringUrl, headers={"Authorization": "Bearer {}".format(token.token)})
keys_dict = response.json()
conn_str = keys_dict["connectionStrings"][0]["connectionString"]
# Connect to Azure Cosmos DB for MongoDB
client = pymongo.MongoClient(conn_str)
# To connect to the database, use the connection variable ("client" in this case), and the database name
ProductDatabase = client["products"]
# Add code to connect to a collection and add an entry here
C#
using MongoDB.Driver;
using Azure.Identity;
using Azure.Core;
using System;
using System.Net.Http;
using System.Text.Json;
using System.Collections.Generic;
using System.Threading.Tasks;
public class Products
{
public int ProductId { get; set; }
public string name { get; set; }
}
class test
{
public static async Task Main(string[] args)
{
// Environment variables
var endpoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_RESOURCEENDPOINT");
var listConnectionStringUrl = Environment.GetEnvironmentVariable("AZURE_COSMOS_LISTCONNECTIONSTRINGURL");
var scope = Environment.GetEnvironmentVariable("AZURE_COSMOS_SCOPE");
// Uncomment the corresponding lines for the authentication type you want to use.
// For system-assigned identity.
// var tokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var tokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID")
// });
// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_COSMOS_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTSECRET");
// var tokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Acquire the access token.
AccessToken accessToken = await tokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new[] { scope }));
// Get the connection string.
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken.Token}");
var response = await httpClient.PostAsync(listConnectionStringUrl, null);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
// Parse the connection string.
var connectionStrings = JsonSerializer.Deserialize<Dictionary<string, List<Dictionary<string, string>>>>(responseBody);
string connectionString = connectionStrings["connectionStrings"][0]["connectionString"];
// Initialize the MongoClient with the connection string.
var mongoClient = new MongoClient(connectionString);
// Connect to the "products" database.
var ProductDatabase = mongoClient.GetDatabase("products");
// Add code to connect to a collection and add an entry here.
}
}
Как только мы подключимся с помощью драйвера, мы либо создадим новую базу данных, либо укажем на существующую с помощью методов GetDatabase или аналогичных, в зависимости от языка. Теперь наше приложение может использовать переменную ProductDatabase для указания на нужную базу данных. Создание или подключение к коллекции так же просто, как и создание новой базы данных.
Создание коллекции для Azure Cosmos DB для MongoDB
Чтобы создать или получить доступ к существующей коллекции, мы используем метод получения коллекции или ссылку в зависимости от языка программирования. Давайте добавим код в предыдущий пример, чтобы создать или подключиться к коллекции и добавить в нее одну запись.
Node.js
// Add code to connect to a collection and add and find an entry here
var collection = ProductDatabase.collection('documents');
var insertResult = await collection.insertOne({ ProductId: 1, name: "bread" });
// return data where ProductId = 1
const findProduct = await collection.find({ProductId: 1});
await findProduct.forEach(console.log);
Java
// Add code to connect to a collection and add and find an entry here
MongoCollection collection = ProductDatabase.getCollection("products");
collection.insertOne(new Document()
.append("ProductId", 1)
.append("name", "bread"));
// return data where ProductId = 1
Document findProduct = (Document) collection.find(eq("ProductId", 1)).first();
System.out.println(findProduct.toJson());
Python
# Add code to connect to a collection and add an entry here
collection = ProductDatabase["products"]
collection.insert_one({ "ProductId": 1, "name": "bread" })
C#
// Add code to connect to a collection and add an entry here
var ProductCollection = ProductDatabase.GetCollection<Products>("products");
Products Product = new Products {ProductId=1,name="bread"};
ProductCollection.InsertOne (Product);
В следующем уроке мы увидим, как именно мы создали строку подключения.
Использование команд расширения MongoDB для управления данными, хранящимися в API-интерфейсе Azure Cosmos DB для MongoDB
Как мы уже говорили ранее, Azure Cosmos DB для MongoDB предоставляет нам возможность использовать те же драйверы и код, которые мы использовали для доступа к объектам и созданию объектов на сервере MongoDB для нашей учетной записи Azure Cosmos DB. Однако с помощью этого кода для создания баз данных и коллекций используются параметры создания Azure Cosmos DB по умолчанию. Чтобы воспользоваться преимуществами функций Azure Cosmos DB, необходимо управлять параметрами создания базы данных и коллекции, такими как пропускная способность, автомасштабирование, назначение ключей сегментов и определение индексов. Azure Cosmos DB для MongoDB предоставляет нам эту возможность с помощью расширенных команд для определения этих параметров. Эти команды позволяют писать в коде более точные инструкции по созданию или изменению баз данных и коллекций специально для Azure Cosmos DB.
Azure Cosmos DB для MongoDB предоставляет команды расширения для следующих типов запросов:
- Создание базы данных
- Обновление базы данных
- Получение базы данных
- Создание коллекции
- Обновление коллекции
- Получить коллекцию
Драйверы MongoDB предоставляют функцию для выполнения команд в базе данных. Мы используем эту функцию для отправки расширенных команд в Azure Cosmos DB. Давайте рассмотрим код для создания коллекции устройств Интернета вещей с пропускной способностью 2000 единиц запросов и шард ключом DeviceId.
Node.js
// create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
var result = IOTDatabase.command({customAction: "CreateCollection", collection: "Devices", offerThroughput: 2000, shardKey: "DeviceId"});
Java
// create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
Document DevCollectionDef = new Document();
DevCollectionDef.append("customAction", "CreateCollection");
DevCollectionDef.append("collection", "Devices");
DevCollectionDef.append("offerThroughput", 2000);
DevCollectionDef.append("shardKey", "DeviceId");
Document result = IOTDatabase.runCommand(DevCollectionDef);
Python
# create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
IOTDatabase.command({'customAction': "CreateCollection", 'collection': "Devices", 'offerThroughput': 2000, 'shardKey': "DeviceId"})
C#
// create the Devices collection with a throughput of 1000 RUs and with EmployeeId as the sharding key
var result = IOTDatabase.RunCommand<BsonDocument>(@"{customAction: ""CreateCollection"", collection: ""Devices"", offerThroughput: 2000, shardKey: ""DeviceId""}");
Аналогичным образом можно изменить коллекцию или создать или изменить базу данных. Дополнительные сведения см. в статье Использование команд расширения MongoDB для управления данными, хранящимися в API-интерфейсе Azure Cosmos DB для MongoDB.