Как задать поле для каждого документа в Cosmos db?

#azure-cosmosdb

#azure-cosmosdb

Вопрос:

Как будет выглядеть хранимая процедура Cosmos, которая установит для поля PumperID для каждой записи значение по умолчанию?

Нам нужно сделать это, чтобы восстановить некоторые данные, поэтому процедура будет посещать каждую запись, содержащую поле PumperID (не во всех документах оно есть), и устанавливать для него значение по умолчанию.

введите описание изображения здесь

Комментарии:

1. По какой-либо причине это не будет установлено клиентом, создающим titem?

2. Я обновил свой вопрос, чтобы уточнить, почему мы хотим это сделать.

Ответ №1:

Предполагая одноразовую задачу обслуживания данных, возможно, самым простым решением является создание универсального консольного приложения .NET Core и использование SDK для запроса элементов, требующих изменений, и выполнения обновлений. Я использовал этот подход, например, для переименования свойств. Это работает для любой базы данных Cosmos и не требует развертывания каких-либо хранимых процедур или иным образом.

В идеале он должен быть идемпотентным, чтобы его можно было запускать несколько раз, если для получения новых поступающих данных требуется несколько проходов. Если количество элементов велико, можно дополнительно использовать операции SDK для увеличения пропускной способности при запуске и уменьшения по завершении. Для повышения производительности запустите его рядом с конечной точкой на виртуальной машине или функции Azure.

Ответ №2:

Для сценариев, в которых требуется выполнить итерацию по каждому элементу в контейнере и обновить свойство, лучшим средством для достижения этой цели является использование обработчика ленты изменений и выполнение операции в функции Azure или виртуальной машине. Дополнительные сведения и примеры для начала см. в разделе Change Feed Processor.

С помощью ленты изменений вы захотите запустить ее для чтения с начала контейнера. Для этого см. раздел Чтение ленты изменений с самого начала.

Затем в вашем делегате вы будете считывать каждый элемент из ленты изменений, проверять его значение, а затем вызывать ReplaceItemAsync() для обратной записи, если его необходимо обновить.

 static async Task HandleChangesAsync(IReadOnlyCollection<MyType> changes, CancellationToken cancellationToken)
{
    Console.WriteLine("Started handling changes...");
    foreach (MyType item in changes)
    {
        if(item.PumperID == null)
        {
            item.PumperID = "some value"
            //call ReplaceItemAsync(), etc.
        }
    }

    Console.WriteLine("Finished handling changes.");
}
  

Комментарии:

1. спасибо! Я обновил свой вопрос, чтобы уточнить, почему мы хотим это сделать. Нам нужна хранимая процедура.

2. Понял. В этом сценарии, когда вы хотите обновить каждый экземпляр этого свойства, вы должны использовать ChangeFeed . Я обновлю ответ.