Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
Внимание
Дополнительные сведения о пакете SDK версии 3 .NET для Azure Cosmos DB см. в заметках о выпуске, в Репозитории .NET GitHub, в советах по повышению эффективности для пакета SDK версии 3 для .NET, а также в руководстве по устранению неполадок.
В этой статье рассматриваются некоторые рекомендации по обновлению существующего приложения .NET до более нового пакета SDK для .NET Azure Cosmos DB версии 3 для API для NoSQL. Пакет SDK для .NET для Azure Cosmos DB версии 3 соответствует пространству имен Microsoft.Azure Cosmos DB. Сведения из этого документа можно использовать при переводе приложения с любого из следующих пакетов средств разработки .NET для Azure Cosmos DB:
- Пакет SDK Azure Cosmos DB для .NET Framework, версия 2, для API NoSQL
- Пакет SDK Azure Cosmos DB для .NET Core, версия 2, для API NoSQL
Инструкции в этой статье также помогут перенести следующие внешние библиотеки, которые теперь являются частью пакета SDK для .NET для Azure Cosmos DB версии 3 для API для NoSQL:
- Библиотека обработчика изменений .NET версии 2.0
- Библиотека исполнителя массовых операций .NET версии 1.1 или более поздней
Новые возможности версии 3 пакета SDK для .NET
Пакет SDK версии 3 содержит множество улучшений для удобства использования и повышения эффективности, включая перечисленные ниже.
- Понятная модель именования в программировании
- .NET Standard 2.0**
- Повышение производительности за счет поддержки API потоков
- Иерархия в стиле Fluent, устраняющая необходимость в фабрике URI.
- Встроенная поддержка библиотеки обработчика изменений
- Встроенная поддержка массовых операций
- "Мокируемые API для упрощенного модульного тестирования"
- Поддержка пакетов транзакций и Blazor
- Подключаемые сериализаторы
- Масштабирование контейнеров без секционирования и с автомасштабированием
** Пакет SDK предназначен для версии .NET Standard 2.0, в которой существующие SDK для платформы .NET для Azure Cosmos DB и .NET Core объединены в общий пакет SDK для .NET. Пакет SDK для .NET можно использовать на любой платформе, реализующей функции .NET Standard 2.0, включая приложения на базе .NET Framework 4.6.1+ и .NET Core 2.0+.
Большая часть логики сетевых соединений и повторных попыток, а также более низкие уровни SDK в основном остаются без изменений.
Пакет SDK версии 3 для .NET для Azure Cosmos DB теперь является продуктом с открытым исходным кодом. Мы приветствуем любые pull requests и будем отслеживать проблемы и отзывы на GitHub. Мы будем работать над внедрением любых функций, которые улучшат взаимодействие с клиентами.
Зачем переходить на пакет SDK версии 3для .NET
Помимо многочисленных улучшений с точки зрения удобства и эффективности, новые функции, добавленные в последнюю версию SDK, не будут переноситься в более старые версии. В настоящее время пакет SDK версии 2 находится в режиме обслуживания. Для максимального удобства рекомендуем всегда начинать разработку с последней поддерживаемой версии пакета SDK.
Важные изменения имен при переходе с версии 2 пакета SDK на версию 3
Следующие изменения имен были применены в пакете SDK для .NET 3.0 для соответствия соглашениям об именовании API для API для NoSQL:
-
DocumentClientпереименовывается вCosmosClient -
Collectionпереименовывается вContainer -
Documentпереименовывается вItem
Все объекты ресурсов переименовываются с использованием дополнительных свойств, которые для ясности содержат имя ресурса.
Ниже перечислены некоторые важные изменения в именах классов.
| Пакет SDK версии 2 для .NET | Пакет SDK версии 3 для .NET |
|---|---|
Microsoft.Azure.Documents.Client.DocumentClient |
Microsoft.Azure.Cosmos.CosmosClient |
Microsoft.Azure.Documents.Client.ConnectionPolicy |
Microsoft.Azure.Cosmos.CosmosClientOptions |
Microsoft.Azure.Documents.Client.DocumentClientException |
Microsoft.Azure.Cosmos.CosmosException |
Microsoft.Azure.Documents.Client.Database |
Microsoft.Azure.Cosmos.DatabaseProperties |
Microsoft.Azure.Documents.Client.DocumentCollection |
Microsoft.Azure.Cosmos.ContainerProperties |
Microsoft.Azure.Documents.Client.RequestOptions |
Microsoft.Azure.Cosmos.ItemRequestOptions |
Microsoft.Azure.Documents.Client.FeedOptions |
Microsoft.Azure.Cosmos.QueryRequestOptions |
Microsoft.Azure.Documents.Client.StoredProcedure |
Microsoft.Azure.Cosmos.StoredProcedureProperties |
Microsoft.Azure.Documents.Client.Trigger |
Microsoft.Azure.Cosmos.TriggerProperties |
Microsoft.Azure.Documents.SqlQuerySpec |
Microsoft.Azure.Cosmos.QueryDefinition |
Замена классов в пакете SDK версии 3 для .NET
В пакете SDK версии 3.0 были заменены перечисленные ниже классы.
Microsoft.Azure.Documents.UriFactory
Класс Microsoft.Azure.Documents.UriFactory был заменен концепцией Fluent Design.
Container container = client.GetContainer(databaseName,containerName);
ItemResponse<SalesOrder> response = await this._container.CreateItemAsync(
salesOrder,
new PartitionKey(salesOrder.AccountNumber));
Microsoft.Azure.Documents.Document
Так как SDK для .NET версии 3 позволяет пользователям настраивать пользовательский механизм сериализации, прямой замены для типа Document не существует. При использовании Newtonsoft.Json (механизм сериализации по умолчанию) для выполнения этой функции можно использовать JObject. При использовании другого механизма сериализации можно использовать базовый тип документа JSON (например, JsonDocument для System.Text.Json). Рекомендуется использовать тип C#, который отражает схему элементов, а не полагаться на универсальные типы.
Microsoft.Azure.Documents.Resource
Для Resource, когда она использовалась для документов, не существует прямой замены, следуйте указаниям для Document.
Microsoft.Azure.Documents.AccessCondition
IfNoneMatch или IfMatch теперь доступны на Microsoft.Azure.Cosmos.ItemRequestOptions напрямую.
Изменения в создании идентификаторов элементов
В пакете SDK версии 3 для .NET идентификатор элемента больше не подставляется автоматически. Таким образом, идентификатор элемента должен содержать специально сгенерированное идентификационное значение. Вот пример:
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
Изменение поведения по умолчанию для режима соединения
Пакет SDK версии 3 теперь по умолчанию использует режимы подключения Direct+ TCP по сравнению с предыдущим пакетом SDK версии 2, который по умолчанию используется в режимах подключений Gateway + HTTPS. Это изменение помогает повысить производительность и масштабируемость.
Изменения параметров FeedOptions (QueryRequestOptions в пакете SDK версии 3.0)
Класс FeedOptions в пакете SDK версии 2 был переименован в QueryRequestOptions версии 3. В пределах этого класса у некоторых свойств было изменено имя и/или значение по умолчанию либо они были полностью удалены.
| Пакет SDK версии 2 для .NET | Пакет SDK версии 3 для .NET |
|---|---|
FeedOptions.MaxDegreeOfParallelism |
QueryRequestOptions.MaxConcurrency — Значение по умолчанию и связанное с ним поведение остаются неизменными. Операции, выполняемые на стороне клиента во время параллельного выполнения запроса, будут исполняться последовательно без параллелизма. |
FeedOptions.PartitionKey |
QueryRequestOptions.PartitionKey — сохранено текущее поведение. |
FeedOptions.EnableCrossPartitionQuery |
Удалено. Поведение по умолчанию в пакете SDK 3.0 заключается в том, что межсекционные запросы будут выполняться без необходимости включить свойство специально. |
FeedOptions.PopulateQueryMetrics |
Удалено. Теперь она включена по умолчанию и является частью диагностики. |
FeedOptions.RequestContinuation |
Удалено. Теперь это относится непосредственно к самим методам запроса. |
FeedOptions.JsonSerializerSettings |
Удалено. Узнайте, как настроить сериализацию для получения дополнительных сведений. |
FeedOptions.PartitionKeyRangeId |
Удалено. Тот же результат можно получить с помощью FeedRange в качестве входных данных для метода запроса. |
FeedOptions.DisableRUPerMinuteUsage |
Удалено. |
Создание клиента
В SDK версии 3 для .NET предоставляется класс Fluent CosmosClientBuilder, который заменяет необходимость в фабрике URI SDK версии 2.
Fluent Design создаёт URL-адреса во внутреннем процессе и позволяет передавать один объект Container вместо DocumentClient, DatabaseName и DocumentCollection.
В примере ниже создается новый объект CosmosClientBuilder со строгим уровнем ConsistencyLevel и списком предпочтительных расположений.
CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder(
accountEndpoint: "https://testcosmos.documents.azure.com:443/",
authKeyOrResourceToken: "SuperSecretKey")
.WithConsistencyLevel(ConsistencyLevel.Strong)
.WithApplicationRegion(Regions.EastUS);
CosmosClient client = cosmosClientBuilder.Build();
Исключения
Если пакет SDK версии 2 используется DocumentClientException для сигнализации об ошибках во время операций, то пакет SDK версии 3 использует CosmosException, который предоставляет StatusCode, Diagnostics и другую информацию, связанную с ответами. Вся полная информация сериализуется при использовании ToString():
catch (CosmosException ex)
{
HttpStatusCode statusCode = ex.StatusCode;
CosmosDiagnostics diagnostics = ex.Diagnostics;
// store diagnostics optionally with diagnostics.ToString();
// or log the entire error details with ex.ToString();
}
Диагностика
Если в пакете SDK версии 2 диагностика была доступна только для режима прямого подключения через свойство RequestDiagnosticsString, то в пакете SDK версии 3 используются Diagnostics, доступные во всех ответах и исключениях, что более полно и не ограничено режимом прямого подключения. Они включают не только время, потраченное пакетом SDK на операцию, но и регионы, с которыми связывалась операция:
try
{
ItemResponse<MyItem> response = await container.ReadItemAsync<MyItem>(
partitionKey: new PartitionKey("MyPartitionKey"),
id: "MyId");
TimeSpan elapsedTime = response.Diagnostics.GetElapsedTime();
if (elapsedTime > somePreDefinedThreshold)
{
// log response.Diagnostics.ToString();
IReadOnlyList<(string region, Uri uri)> regions = response.Diagnostics.GetContactedRegions();
}
}
catch (CosmosException cosmosException) {
string diagnostics = cosmosException.Diagnostics.ToString();
TimeSpan elapsedTime = cosmosException.Diagnostics.GetElapsedTime();
IReadOnlyList<(string region, Uri uri)> regions = cosmosException.Diagnostics.GetContactedRegions();
// log cosmosException.ToString()
}
Политика подключения
Некоторые параметры в ConnectionPolicy были переименованы или заменены на CosmosClientOptions.
| Пакет SDK версии 2 для .NET | Пакет SDK версии 3 для .NET |
|---|---|
EnableEndpointDiscovery |
LimitToEndpoint — значение теперь инвертировано, если для пункта EnableEndpointDiscovery задано значение true, то для LimitToEndpoint должно быть задано false. Перед использованием этого параметра необходимо понять, как он влияет на клиент. |
ConnectionProtocol |
Удалено. Протокол связан с режимом: Gateway (HTTPS) или Direct (TCP). Прямой режим с протоколом HTTPS в пакете SDK версии 3 больше не поддерживается, и мы рекомендуем перейти на протокол TCP. |
MediaRequestTimeout |
Удалено. Вложения больше не поддерживаются. |
SetCurrentLocation |
Для достижения того же результата можно использовать CosmosClientOptions.ApplicationRegion. |
PreferredLocations |
Для достижения того же результата можно использовать CosmosClientOptions.ApplicationPreferredRegions. |
UserAgentSuffix |
Для достижения того же результата можно использовать CosmosClientBuilder.ApplicationName. |
UseMultipleWriteLocations |
Удалено. Пакет SDK автоматически определяет, поддерживает ли учетная запись несколько конечных точек записи. |
Политика индексирования
В политике индексации невозможно настроить эти свойства. Если не указано иное, эти свойства теперь всегда будут иметь следующие значения:
| Название свойства | Новое значение (не настраиваемое) |
|---|---|
Kind |
range |
dataType |
String и Number. |
В этом разделе приведены примеры политики индексирования для включения и исключения путей. Благодаря улучшениям в обработчике запросов настройка этих свойств не влияет на производительность, даже если вы используете старую версию пакета SDK.
Токен сеанса
В случаях, когда в SDK версии 2 отображался токен сеанса ответа как ResourceResponse.SessionToken, поскольку захват токена сеанса требовался, и так как токен сеанса является заголовком, в SDK версии 3 это значение отображается в свойстве Headers.Session любого ответа.
Метка времени
В тех случаях, когда пакет SDK версии 2 предоставляет метку времени документа через свойство Timestamp, поскольку Document больше не доступно, пользователи могут сопоставить _tsсистемное свойство со свойством в своей модели.
OpenAsync
Для вариантов использования, при которых OpenAsync() применялся для подготовки клиента пакета SDK версии 2, CreateAndInitializeAsync можно использовать для создания и подготовки клиента пакета SDK версии 3.
Использование API-интерфейсов обработчика канала изменений непосредственно из пакета SDK версии 3
В SDK версии 3 интегрирована поддержка API для обработчика канала изменений, позволяющая вам использовать тот же SDK для создания вашего приложения и реализации обработчика канала изменений. Ранее приходилось использовать отдельную библиотеку для процессора потока изменений.
Дополнительные сведения см. в статье о переходе с библиотеки обработчика канала изменений на пакет SDK версии 3 для .NET для Azure Cosmos DB.
Запросы ленты изменений
Выполнение запросов канала изменений в пакете SDK версии 3 считается использованием пулловой модели канала изменений. Для переноса конфигурации следуйте этой таблице:
| Пакет SDK версии 2 для .NET | Пакет SDK версии 3 для .NET |
|---|---|
ChangeFeedOptions.PartitionKeyRangeId |
FeedRange — Чтобы обеспечить параллелизм при считывании фида изменений, можно использовать FeedRanges. Это больше не является обязательным параметром, теперь вы можете легко читать канал изменений для всего контейнера. |
ChangeFeedOptions.PartitionKey |
FeedRange.FromPartitionKey — FeedRange, представляющий нужный ключ секции, можно использовать для чтения канала изменений для соответствующего значения ключа секции. |
ChangeFeedOptions.RequestContinuation |
ChangeFeedStartFrom.Continuation — Итератор канала изменений можно остановить и возобновить в любое время, сохранив продолжение и используя его при создании нового итератора. |
ChangeFeedOptions.StartTime |
ChangeFeedStartFrom.Time |
ChangeFeedOptions.StartFromBeginning |
ChangeFeedStartFrom.Beginning |
ChangeFeedOptions.MaxItemCount |
ChangeFeedRequestOptions.PageSizeHint — Итератор потока изменений можно остановить и возобновить в любое время, сохранив продолжение и используя его при создании нового итератора. |
IDocumentQuery.HasMoreResults |
response.StatusCode == HttpStatusCode.NotModified — Лента изменений концептуально бесконечна, поэтому всегда может быть больше результатов. Если ответ содержит HttpStatusCode.NotModified код состояния, это означает, что в настоящее время новые изменения для чтения отсутствуют. Это можно использовать для остановки и сохранения продолжения или временного перевода в спящий режим или режим ожидания с последующим повторным вызовом ReadNextAsync для проверки новых изменений. |
| Обработка разделения | Пользователям больше не требуется обрабатывать исключения разделения при чтении ленты изменений, разделение будет прозрачно обрабатываться без вмешательства пользователя. |
Использование библиотеки исполнителя массовых операций непосредственно из пакета SDK версии 3
В пакет SDK версии 3 добавлена встроенная поддержка библиотеки исполнителя массовых операций, благодаря чему один пакет SDK можно использовать для создания приложения и выполнения массовых операций. Ранее приходилось использовать отдельную библиотеку исполнителя массовых операций.
Подробнее см. статью Миграция из библиотеки исполнителя массовых операций на использование функции поддержки массовых операций в пакете SDK для Azure Cosmos DB .NET версии 3
Настраиваемая сериализация
Пакет SDK для .NET версии 2 позволяет задать JsonSerializerSettings в RequestOptions на уровне операций, используемом для десериализации документа результата:
// .NET V2 SDK
var result = await container.ReplaceDocumentAsync(document, new RequestOptions { JsonSerializerSettings = customSerializerSettings })
Пакет SDK для .NET версии 3 предоставляет интерфейс сериализатора для полной настройки обработчика сериализации или более универсальных параметров сериализации в рамках построения клиента.
Настройка сериализации на уровне операции может быть достигнута с помощью API Stream:
// .NET V3 SDK
using(Response response = await this.container.ReplaceItemStreamAsync(stream, "itemId", new PartitionKey("itemPartitionKey"))
{
using(Stream stream = response.ContentStream)
{
using (StreamReader streamReader = new StreamReader(stream))
{
// Read the stream and do dynamic deserialization based on type with a custom Serializer
}
}
}
Сравнение фрагментов кода
В следующем фрагменте кода показаны различия в создании ресурсов в версиях 2 и 3 пакета SDK:
Операции с базой данных
Создание базы данных
// Create database with no shared provisioned throughput
DatabaseResponse databaseResponse = await client.CreateDatabaseIfNotExistsAsync(DatabaseName);
Database database = databaseResponse;
DatabaseProperties databaseProperties = databaseResponse;
// Create a database with a shared manual provisioned throughput
string databaseIdManual = new string(DatabaseName + "_SharedManualThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdManual, ThroughputProperties.CreateManualThroughput(400));
// Create a database with shared autoscale provisioned throughput
string databaseIdAutoscale = new string(DatabaseName + "_SharedAutoscaleThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdAutoscale, ThroughputProperties.CreateAutoscaleThroughput(4000));
Чтение базы данных по идентификатору
// Read a database
Console.WriteLine($"{Environment.NewLine} Read database resource: {DatabaseName}");
database = client.GetDatabase(DatabaseName);
Console.WriteLine($"{Environment.NewLine} database { database.Id.ToString()}");
// Read all databases
string findQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(findQueryText))
{
while (feedIterator.HasMoreResults)
{
FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
foreach (DatabaseProperties _database in databaseResponses)
{
Console.WriteLine($"{ Environment.NewLine} database {_database.Id.ToString()}");
}
}
}
Удаление базы данных
// Delete a database
await client.GetDatabase(DatabaseName).DeleteAsync();
Console.WriteLine($"{ Environment.NewLine} database {DatabaseName} deleted.");
// Delete all databases in an account
string deleteQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(deleteQueryText))
{
while (feedIterator.HasMoreResults)
{
FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
foreach (DatabaseProperties _database in databaseResponses)
{
await client.GetDatabase(_database.Id).DeleteAsync();
Console.WriteLine($"{ Environment.NewLine} database {_database.Id} deleted");
}
}
}
Операции с контейнерами
Создание контейнера (автоподбор масштаба + время хранения с истечением срока действия)
private static async Task CreateManualThroughputContainer(Database database)
{
// Set throughput to the minimum value of 400 RU/s manually configured throughput
string containerIdManual = ContainerName + "_Manual";
ContainerResponse container = await database.CreateContainerIfNotExistsAsync(
id: containerIdManual,
partitionKeyPath: partitionKeyPath,
throughput: 400);
}
// Create container with autoscale
private static async Task CreateAutoscaleThroughputContainer(Database database)
{
string autoscaleContainerId = ContainerName + "_Autoscale";
ContainerProperties containerProperties = new ContainerProperties(autoscaleContainerId, partitionKeyPath);
Container container = await database.CreateContainerIfNotExistsAsync(
containerProperties: containerProperties,
throughputProperties: ThroughputProperties.CreateAutoscaleThroughput(autoscaleMaxThroughput: 4000);
}
// Create a container with TTL Expiration
private static async Task CreateContainerWithTtlExpiration(Database database)
{
string containerIdManualwithTTL = ContainerName + "_ManualTTL";
ContainerProperties properties = new ContainerProperties
(id: containerIdManualwithTTL,
partitionKeyPath: partitionKeyPath);
properties.DefaultTimeToLive = (int)TimeSpan.FromDays(1).TotalSeconds; //expire in 1 day
ContainerResponse containerResponse = await database.CreateContainerIfNotExistsAsync(containerProperties: properties);
ContainerProperties returnedProperties = containerResponse;
}
Считывание свойств контейнера
private static async Task ReadContainerProperties(Database database)
{
string containerIdManual = ContainerName + "_Manual";
Container container = database.GetContainer(containerIdManual);
ContainerProperties containerProperties = await container.ReadContainerAsync();
}
Удаление контейнера
private static async Task DeleteContainers(Database database)
{
string containerIdManual = ContainerName + "_Manual";
// Delete a container
await database.GetContainer(containerIdManual).DeleteContainerAsync();
// Delete all CosmosContainer resources for a database
using (FeedIterator<ContainerProperties> feedIterator = database.GetContainerQueryIterator<ContainerProperties>())
{
while (feedIterator.HasMoreResults)
{
foreach (ContainerProperties _container in await feedIterator.ReadNextAsync())
{
await database.GetContainer(_container.Id).DeleteContainerAsync();
Console.WriteLine($"{Environment.NewLine} deleted container {_container.Id}");
}
}
}
}
Операции с элементами и запросами
Создание элемента
private static async Task CreateItemAsync(Container container)
{
// Create a SalesOrder POCO object
SalesOrder salesOrder1 = GetSalesOrderSample("Account1", "SalesOrder1");
ItemResponse<SalesOrder> response = await container.CreateItemAsync(salesOrder1,
new PartitionKey(salesOrder1.AccountNumber));
}
private static async Task RunBasicOperationsOnDynamicObjects(Container container)
{
// Dynamic Object
dynamic salesOrder = new
{
id = "SalesOrder5",
AccountNumber = "Account1",
PurchaseOrderNumber = "PO18009186470",
OrderDate = DateTime.UtcNow,
Total = 5.95,
};
Console.WriteLine("\nCreating item");
ItemResponse<dynamic> response = await container.CreateItemAsync<dynamic>(
salesOrder, new PartitionKey(salesOrder.AccountNumber));
dynamic createdSalesOrder = response.Resource;
}
Прочитайте все элементы в контейнере
private static async Task ReadAllItems(Container container)
{
// Read all items in a container
List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();
using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
queryDefinition: null,
requestOptions: new QueryRequestOptions()
{
PartitionKey = new PartitionKey("Account1"),
MaxItemCount = 5
}))
{
while (resultSet.HasMoreResults)
{
FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
SalesOrder salesOrder = response.First();
Console.WriteLine($"\n1.3.1 Account Number: {salesOrder.AccountNumber}; Id: {salesOrder.Id}");
allSalesForAccount1.AddRange(response);
}
}
}
Элементы запроса
Изменения в классе SqlQuerySpec (QueryDefinition в SDK версии 3.0)
Класс SqlQuerySpec в пакете SDK версии 2 переименован в QueryDefinition в пакете SDK версии 3.
SqlParameterCollection и SqlParameter были удалены. Параметры в объект QueryDefinition теперь добавляются через построителя моделей с помощью функции QueryDefinition.WithParameter. Доступ к параметрам пользователи могут получить с помощью метода QueryDefinition.GetQueryParameters
private static async Task QueryItems(Container container)
{
// Query for items by a property other than Id
QueryDefinition queryDefinition = new QueryDefinition(
"select * from sales s where s.AccountNumber = @AccountInput")
.WithParameter("@AccountInput", "Account1");
List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();
using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
queryDefinition,
requestOptions: new QueryRequestOptions()
{
PartitionKey = new PartitionKey("Account1"),
MaxItemCount = 1
}))
{
while (resultSet.HasMoreResults)
{
FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
SalesOrder sale = response.First();
Console.WriteLine($"\n Account Number: {sale.AccountNumber}; Id: {sale.Id};");
allSalesForAccount1.AddRange(response);
}
}
}
Удаление элемента
private static async Task DeleteItemAsync(Container container)
{
ItemResponse<SalesOrder> response = await container.DeleteItemAsync<SalesOrder>(
partitionKey: new PartitionKey("Account1"), id: "SalesOrder3");
}
Запрос на ленту изменений
private static async Task QueryChangeFeedAsync(Container container)
{
FeedIterator<SalesOrder> iterator = container.GetChangeFeedIterator<SalesOrder>(ChangeFeedStartFrom.Beginning(), ChangeFeedMode.Incremental);
string continuation = null;
while (iterator.HasMoreResults)
{
FeedResponse<SalesOrder> response = await iteratorForTheEntireContainer.ReadNextAsync();
if (response.StatusCode == HttpStatusCode.NotModified)
{
// No new changes
continuation = response.ContinuationToken;
break;
}
else
{
// Process the documents in response
}
}
}
Следующие шаги
- Создание консольного приложения для управления данными Azure Cosmos DB для NoSQL с помощью пакета SDK версии 3
- Вы пытаетесь планировать емкость для миграции в Azure Cosmos DB?
- Если вам известно только количество виртуальных ядер и серверов в существующем кластере баз данных, прочитайте об оценке единиц запроса с использованием виртуальных ядер (vCores) или процессоров (vCPUs).
- Если вам известна стандартная частота запросов для текущей рабочей нагрузки базы данных, ознакомьтесь со статьей о расчете единиц запросов с помощью планировщика ресурсов Azure Cosmos DB