Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Дополнительные сведения о пакете SDK для .NET для Azure Cosmos DB версии 3 см. в заметках о выпуске, репозитории .NET GitHub, советах по производительности пакета SDK для .NET версии 3 и руководстве по устранению неполадок.
В этой статье рассматриваются некоторые рекомендации по обновлению существующего приложения .NET до более нового пакета SDK для .NET Azure Cosmos DB версии 3 для API для NoSQL. Пакет SDK для .NET для Azure Cosmos DB версии 3 соответствует пространству имен Microsoft.Azure Cosmos DB. Сведения, предоставленные в этом документе, можно использовать, если вы переносите приложение из любого из следующих пакетов Azure Cosmos DB .NET SDK.
- Пакет SDK для .NET Framework для Azure Cosmos DB версии 2 для API для NoSQL
- SDK для .NET Core версии 2 для API NoSQL в Azure Cosmos DB
Инструкции в этой статье также помогут перенести следующие внешние библиотеки, которые теперь являются частью пакета SDK для .NET для Azure Cosmos DB версии 3 для API для NoSQL:
- Библиотека обработчика канала изменений .NET 2.0
- Библиотека массового исполнителя .NET 1.1 или более поздней версии
Новые возможности пакета SDK для .NET версии 3
Пакет SDK версии 3 содержит множество улучшений удобства использования и производительности, в том числе:
- Интуитивно понятное именование модели программирования
- .NET Standard 2.0 **
- Повышение производительности с помощью поддержки API потоковой передачи
- Иерархия Fluent, заменяющая необходимость в фабрике URI.
- Встроенная поддержка библиотеки обработчика ленты изменений
- Встроенная поддержка массовых операций
- Mockable API для упрощения модульного тестирования
- Поддержка транзакционных пакетов и Blazor
- Подключаемые сериализаторы
- Масштабирование неразделённых и автоматически масштабируемых контейнеров
** Пакет SDK предназначен для .NET Standard 2.0, который объединяет существующие пакеты SDK для .NET Framework и .NET Core Azure Cosmos DB в один пакет SDK для .NET. Пакет SDK для .NET можно использовать на любой платформе, реализующей .NET Standard 2.0, включая приложения .NET Framework 4.6.1+ и .NET Core 2.0+.
Большая часть сети, логика повторных попыток и более низкие уровни пакета SDK остаются в значительной степени неизменными.
Пакет SDK для .NET для Azure Cosmos DB версии 3 теперь открыт. Мы приветствуем все pull-запросы и будем вести журнал и отслеживать отзывы на GitHub. Мы будем работать над функциями, улучшающими взаимодействие с клиентами.
Почему переход на SDK для .NET версии 3?
В дополнение к многочисленным улучшениям удобства использования и производительности новые возможности, сделанные в последнем пакете SDK, не будут перенесены на более старые версии. Пакет SDK версии 2 в настоящее время находится в режиме обслуживания. Для оптимальной разработки рекомендуется всегда начинать с последней поддерживаемой версии пакета SDK.
Основные изменения имен с пакета SDK версии 2 на пакет SDK версии 3
Следующие изменения имен были применены в пакете SDK для .NET 3.0 для соответствия соглашениям об именовании API для API для NoSQL:
-
DocumentClientпереименовывается вCosmosClient -
Collectionпереименовывается вContainer -
Documentпереименовывается вItem
Все объекты ресурсов переименованы с дополнительными свойствами, которые включают имя ресурса для ясности.
Ниже приведены некоторые изменения имени основного класса:
| Пакет SDK для .NET версии 2 | Пакет SDK для .NET версии 3 |
|---|---|
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 для .NET версии 3
Следующие классы были заменены на пакет SDK 3.0:
Microsoft.Azure.Documents.UriFactory
Класс Microsoft.Azure.Documents.UriFactory заменен на простой дизайн.
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 для .NET версии 3. Таким образом, идентификатор элемента должен в частности включать созданный идентификатор. Просмотрите следующий пример:
[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 в SDK версии 3, и в классе некоторые свойства были изменены: изменены имя и/или значение по умолчанию или полностью удалены.
| Пакет SDK для .NET версии 2 | Пакет SDK для .NET версии 3 |
|---|---|
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 для .NET версии 3 предоставляет класс FluentCosmosClientBuilder, который заменяет необходимость в URI Factory пакета SDK версии 2.
Гибкий дизайн создает 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();
Exceptions
Где в версии 2 пакет SDK использовал DocumentClientException для сигнализации об ошибках во время операций, в версии 3 пакет SDK использует 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();
}
Diagnostics
В то время как в SDK версии 2 диагностика была доступна только в режиме Direct через свойство RequestDiagnosticsString, в SDK версии 3 используется Diagnostics, которая присутствует во всех ответах и исключениях, обеспечивая более полные сведения и не ограничиваясь режимом Direct. Они включают не только время, затраченное на 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 для .NET версии 2 | Пакет SDK для .NET версии 3 |
|---|---|
EnableEndpointDiscovery |
LimitToEndpoint — Теперь значение инвертировано: если значение EnableEndpointDiscovery установлено как true, LimitToEndpoint следует установить как false. Прежде чем использовать этот параметр, необходимо понять , как он влияет на клиент. |
ConnectionProtocol |
Удаляются. Протокол привязан к режиму, шлюзу (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 для .NET версии 3 для Azure Cosmos DB
Запросы ленты изменений
Выполнение запросов на ленту изменений в SDK версии 3 рассматривается как использование модели извлечения изменений. Выполните следующую таблицу, чтобы перенести конфигурацию:
| Пакет SDK для .NET версии 2 | Пакет SDK для .NET версии 3 |
|---|---|
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 для .NET V3 для Azure Cosmos DB.
Настраиваемая сериализация
Пакет 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
}
}
}
Сравнения фрагментов кода
В следующем фрагменте кода показаны различия в создании ресурсов между пакетами SDK для .NET версии 2 и версии 3:
Операции базы данных
Создание базы данных
// 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");
}
}
}
Операции контейнеров
Создание контейнера (с автоматическим масштабированием и временем жизни (TTL) с истечением срока действия)
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?
- Если вам известно только количество виртуальных ядер и серверов в существующем кластере баз данных, прочитайте об оценке единиц запроса с использованием виртуальных ядер или виртуальных процессоров.
- Если вам известна стандартная частота запросов для текущей рабочей нагрузки базы данных, ознакомьтесь со статьей о расчете единиц запросов с помощью планировщика ресурсов Azure Cosmos DB